日期:2014-05-20  浏览次数:20663 次

求关于.equals和==的详细原理
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);
}
}
最好能有个栈和堆的分解图,详细点最好,谢谢大虾们,

------解决方案--------------------
能力有限,帮顶~
------解决方案--------------------
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

}
}

------解决方案--------------------
String 类 之所以相等 是因为String类的equals方法被重写了它是把字符串拆分字符然后一个个分别去比较。所以此时就是比较内容了。
造成这种误解的原因,也就是因为很多类重写了equals方法,所以只要弄清楚当前类的情况,就很容易区分了

总结:
从Object层次来说,==与equals是相同的,都是比较内存地址;
当某个类重写了equals方法,此时equals就是比较内容,==永远是比较内存地址;


------解决方案--------------------
我很怀疑怎么老是有人问这个问题
你去看看java虚拟机规范关于字符串常量池的内容吧
------解决方案--------------------
学习了
------解决方案--------------------
http://blog.csdn.net/mengxiangyue/article/details/6816186
这篇文章详细的介绍了,楼主可以去看看
------解决方案--------------------
==比较的不仅是内容,也比较地址
equals仅仅比较内容
------解决方案--------------------
String重写了equals(),很多类没有重写equals()
------解决方案--------------------
==比较的不仅是内容,也比较地址
equals仅仅比较内容