Integer i = new Integer(10);
Integer j =10;
System.out.println(i==j); // false
String a1 = new String("abc");
String a2 = "abc";
System.out.println(a1==a2); // false
但为了提高Java的内存效率,JVM预留了一个特殊的内存区域,称为" String常量池。"当编译器遇到String文本时,它会检查池以查看是否已存在相同的String。如果找到匹配项,则对新文本的引用将定向到现有String,并且不会创建新的String文本对象。 (现有的String只有一个额外的引用。)所以字符串文字是不可变的。因此,a1和a2都有两个引用指向相同的内存位置,然后为什么" =="没有回复吗?
答案 0 :(得分:2)
这是因为a1
不是文字。它是您在字符串池之外的堆上创建的新String
。您使用的构造函数实际上将String
复制到新位置。但是,a2
位于字符串池中。