日期:2014-05-20  浏览次数:20907 次

String比较的问题
String   t0=   new   String( "string ");
String   t1= "strin "+ "g ";
String   t2   =   "string ";
String   t3   =   new   String( "string ");
String   t4   =   "string ";
boolean   five   =   t0==t2;
boolean   six   =   t1==t2;
boolean   seven   =   t0==t3;
boolean   eight   =   t2==t4;
System.out.println(five);
System.out.println(six);
System.out.println(seven);
System.out.println(eight);
请各位演示下或许能得到与我相同的   困惑了
始终认为对象之间使用==比较的话为比较其内存地址(object.getClass()之间的比较除外,这种情况是不考虑继承关系比较实际的Class对象)
String   为一种对象类型   使用==比较应该为比较内存
String   t1= "strin "+ "g ";
String   t2   =   "string ";
t1   t2内存地址相同?还是String   *= "******* ";这时候的String   *不是一个对象了?这种方式不申请新内存(以new为申请一块新的内存)
困惑   期待解答..........

------解决方案--------------------
不知道楼主有什么地方困惑,String类型是final类型的,并且其中重载+号的操作是重新份内配内存空间,新建一个对象,并不是改变原来的对象,String a = "abc " + "a " + "b " + "c ";上面的表达式编译器在执行过程中共分配了三个String类型的对象空间,第一次是定义一个String类型的引用,指向 "abc "这时候并没有分配内存,第一次分配内存是执行的 "abc " + "a "操作,也就是说分配了一个String类型的对象空间,及new了一个String用来保存 "abca ",依次类推,共分配了3次空间,最后一次才是我们的String a 保存的 "abcabc "
------解决方案--------------------
字符串池
String str= "asas "; ///用这种方式声明的字符串 会放到字符串池中
如果下一次再用这种方式声明字符串 程序会先检测字符串池里有没有该字符串 如果有的话 就让引用直接指向它 如果没有 再新建一个字符串 放入字符串池中

而用String str=new String() 这种方式声明的字符串不会放到池中。。

每次都是新建一个字符串
不知道这样说对不对
------解决方案--------------------
String t1= "strin "+ "g ";
String t2 = "string ";


这t1 == t2是由编译器去完成,而不是JVM完成的


因为编译器在编译t1的时候会智能的判断这个地方都是常量,没有必要在运行期去计算,只要编译期完成就可以了

所以它等同于:
String t1= "string ";
String t2 = "string ";

所以t1 == t2