public class a {
public static void main(String[] args) {
String a = "abc";
String b = "abc";
String c = new String("abc");
String d = new String("abc");
System.out.println(a==b); //true
System.out.println(a==c); //false
System.out.println(c==d); //false
}
}
a 与 b 是两个对象为什么会相等?
a与b都是以字面量方式创建的字符串对象,由相同序列的字符组成的两个字符串属于同一对象,位于内存中的同一个位置。对象存在于常量池中,而① 通过 “+”相加得到的字符串对象 与 ② 通过 new关键字生成的字符串对象 ③需要输入的字符串对象 存在于堆中,不在常量池中。a 与 c 为什么不相等?
在编译期间a 是字符串常量"abc"的地址, 而c是在 运行期间 通过new关键字创建,"abc"字符串作为String对象存储在内存中的一个独立位置,以new方式创建的字符串不会加入常量池c 与 d 不相等是一定的,因为是两个对象。
public class a {
public static void main(String[] args) {
String a = "abc";
String c = new String("abc");
c = c.intern();
System.out.println(a==c); //true
}
}
此时 a 与 c 相等,intern()可以访问常量池,检查字符串池里是否存在"abc"这么一个字符串,如果存
在,就返回池里的字符串;如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用。