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