看下面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,我就不太明白了。高手指教。

解决方案 »

  1.   

    用s2.equals(s3);
    ==比较的是两引用是否代表同一对象
      

  2.   

    我要比较的就是两个对象(内存地址),不是他们的value。
      

  3.   

    对于 String s2 ="123"+"4";
    编译完全有能力认为就是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
    所以是不等的
      

  4.   

    ==是根据内存地址来判断的,而对象其实是一个引用,String s1 ="123";String s2 ="123"+"4";String s3 ="1234";
    这个s3,s2都指向内存中的"1234",所以他们相等,
    而第一个String s1 ="123";String s2 =s1 +"4";String s3 ="1234";s2指向的是s1对象的内存地址基础上的,而s3的内存地址和s1并不相等,
      

  5.   

    用==在java里比较字符串,我也碰到类似的问题,
    我现在比较字符串一般用compareTo函数