public class Test {
public static void main(String[] args) {
String a = "123";
String b = a;
String c = a + b;
String d = "123123";
System.out.print(a == b);
System.out.print(a.equals(b));
System.out.print(c == d);
System.out.print(c.equals(d));
System.out.println(c);
System.out.println(d);
}
}
最好能有个栈和堆的分解图,详细点最好,谢谢大虾们,

解决方案 »

  1.   

    public class Test {
    public static void main(String[] args) {
    String a = "123";
    String b = a;
    String c = a + b;
    String d = "123123";
    System.out.print(a == b);  // true ;因为经过编译器优化 所以 a  b 指向同一个内存
    System.out.print(a.equals(b));//ture ;String类的equals比较的是内容 
    System.out.print(c == d);//false  C是生成新的对象  内存地址不同
    System.out.print(c.equals(d));//ture ;String类的equals比较的是内容
    System.out.println(c);//输出 123123
    System.out.println(d);//输出 123123}
    }
      

  2.   

    String 类 之所以相等 是因为String类的equals方法被重写了它是把字符串拆分字符然后一个个分别去比较。所以此时就是比较内容了。
    造成这种误解的原因,也就是因为很多类重写了equals方法,所以只要弄清楚当前类的情况,就很容易区分了总结:
    从Object层次来说,==与equals是相同的,都是比较内存地址;
    当某个类重写了equals方法,此时equals就是比较内容,==永远是比较内存地址;
      

  3.   

    我很怀疑怎么老是有人问这个问题
    你去看看java虚拟机规范关于字符串常量池的内容吧
      

  4.   

    http://blog.csdn.net/mengxiangyue/article/details/6816186
    这篇文章详细的介绍了,楼主可以去看看
      

  5.   

    ==比较的不仅是内容,也比较地址
    equals仅仅比较内容
      

  6.   

    String重写了equals(),很多类没有重写equals()
      

  7.   

    ==比较的不仅是内容,也比较地址
    equals仅仅比较内容
      

  8.   

    引用某人的话(某人的名字和原话都不记得了。。)String作比较就应该用.equals() 没有什么为什么
    让你用你就用,你偏要==你自己蛋疼