看下面2段代码:public class Test{
public static void main(String[] args){
String s1 ="123";
String s2 =s1 +"4";
String s3 ="1234"; System.out.print(s2==s3);
}
}
=============
public class Test{
public static void main(String[] args){
String s1 ="123";
String s2 ="123"+"4";
String s3 ="1234"; System.out.print(s2==s3);
}
} 第一个输出:“false”;第二个输出“true”
============================
第二个我知道,"123"+"4" 生成了一个新的String对象"1234",所以给s3赋值的时候会检查系统是否有这个String对象,因为已经存在,所以s2,s3同时指向一个object。但是,可但是呢,但可是呢。
第一个代码为false,我就不太明白了。高手指教。
public static void main(String[] args){
String s1 ="123";
String s2 =s1 +"4";
String s3 ="1234"; System.out.print(s2==s3);
}
}
=============
public class Test{
public static void main(String[] args){
String s1 ="123";
String s2 ="123"+"4";
String s3 ="1234"; System.out.print(s2==s3);
}
} 第一个输出:“false”;第二个输出“true”
============================
第二个我知道,"123"+"4" 生成了一个新的String对象"1234",所以给s3赋值的时候会检查系统是否有这个String对象,因为已经存在,所以s2,s3同时指向一个object。但是,可但是呢,但可是呢。
第一个代码为false,我就不太明白了。高手指教。
==比较的是两引用是否代表同一对象
编译完全有能力认为就是String s2 = "1234";而对于
String s1 ="123";
String s2 =s1 +"4";
则不会
根据调试
可以发现
String s2 =s1 +"4";
是相当于如下语句
String s2 = new StringBuffer(s1).append("4").toString();
而StringBuffer的toString为 return new String(this);
也就是又new了一个新的string
所以是不等的
这个s3,s2都指向内存中的"1234",所以他们相等,
而第一个String s1 ="123";String s2 =s1 +"4";String s3 ="1234";s2指向的是s1对象的内存地址基础上的,而s3的内存地址和s1并不相等,
我现在比较字符串一般用compareTo函数