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 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 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}
}
造成这种误解的原因,也就是因为很多类重写了equals方法,所以只要弄清楚当前类的情况,就很容易区分了总结:
从Object层次来说,==与equals是相同的,都是比较内存地址;
当某个类重写了equals方法,此时equals就是比较内容,==永远是比较内存地址;
你去看看java虚拟机规范关于字符串常量池的内容吧
这篇文章详细的介绍了,楼主可以去看看
equals仅仅比较内容
equals仅仅比较内容
让你用你就用,你偏要==你自己蛋疼