public class Test_1 {
public static void main(String[] args){
String s1 = "a";
String s2 = s1 + "b";
String s3 = "a" + "b";
System.out.print(s2);
System.out.println(s2 == "ab");
System.out.print(s3);
System.out.println(s3 == "ab");


}
}
运行结果是:
ab false
ab true
为什么比较后第一个是false,第二个是true啊?而且S2,S3都是“ab”啊?

解决方案 »

  1.   

    是同一个对象才会 ==
    不是同一个对象,要比较值相等,  用 equals
      

  2.   

    编译器会直接把 String s3 = "a" + "b";  优化为  String s3 = "ab";
      

  3.   

    String s1 = "a";
    String s2 = s1 + "b";
    String s3 = "a" + "b";
     我觉得 S2 = S1+"b"  是用了S1的引用和 b进行连接了而引用也是一个Object所以S2显示出来的是ab但是它是一个a的引用和b 连起来的一个字符串而 s3 ="a"+"b" 是字符串相加所以 生成的S3对象也就是ab ==是判断对象是否相等 所以第一个false 第二个true
    而equles 就是 ==
    public boolean equls(object o){
       this==o;
    retrun true;
    }
      

  4.   

    ==比较的是内存地址,两个对象的属性一致,但内存地址是不一样的
    String s1=new String("abc");
    String s2=new String("abc");
    if(s1==s2){
        System.out.println("ok");
    }else{
        System.out.println("no");
    }
    s1在栈区,指向一个堆区的对象,"abc"在常量池
    建议lz好好看一下Object类的所有方法。
      

  5.   

    lz看一哈Object类的hashCode方法和 equals方法
      

  6.   

    要不你重写Object类的这两个方法,要不你理解会用即可