如果池内存已经有一个具有相似内容的对象,那么如果我们尝试使用不同的引用变量创建相同的对象,那么只会创建一个新的引用变量,不会创建新的对象。例如;
String s7="1";
String s8 ="1";
System.out.print(s7==s8); //True
这里只创建了一个对象。 但在下面的例子中
public class JavaApplication1 {
public static void main(String[] args) {
String s1 = "1", s2 = "2", s4 = s1 + s2, s5 = "12";
final String s3 = s1 + s2;
s1 += s2;
System.out.print((s1 == s3) + "" + (s1 == s5) + "" + "" (s3 == s5));
}
}
输出为假假假 即使 s3 被声明为最终表达式!为什么?
最佳答案
这是因为
1) 由常量表达式 (§15.28) 计算的字符串在编译时计算,然后将其视为文字。
2) 在运行时通过连接计算的字符串是新创建的,因此是不同的。
这是一个例子:
String s7 = "77";
String s8 = "77";
String s10 = "7";
String s11 = "7";
String s9 = s10+s11;
String s12 = "7"+"7";
//printing the address
System.out.println(System.identityHashCode(s7));
System.out.println(System.identityHashCode(s8));
System.out.println(System.identityHashCode(s9));
System.out.println(System.identityHashCode(s12));
System.out.println(s7==s9);
System.out.println(s7==s12);
输出:
705927765
705927765
366712642 ---> address is different
705927765
false
true
虽然我刚才也经历过这个事情。但这是我的假设:
除String s9 = s10+s11;
之外的所有文字都是在编译时计算的。这就是为什么我们得到不同的地址。
关注String literals javadoc了解更多详情。
关于java - `+=` 运算符是否总是创建一个新的字符串对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47291931/