是在做:
String a = new String();
String b = a;
并做:
String a = new String();
String b = a.intern();
是一样的吗?
实际上,如果我进行测试,则参考文件都是相同的:
String a = new String("te");
String b = a.intern();
String c = a;
String d = "t" + "e";
System.out.print(a.equals(b));
System.out.print(b.equals(c));
System.out.print(a.equals(d));
因为字符串会永远在字符串池中?
最佳答案
您的equals
测试不是在检查引用,而是在检查字符串是否相等。您应该使用==
来检查引用的身份。实际上,您是在错误地犯了新手Java的常见错误-通常人们在应该使用==
时使用equals
。在这种情况下,所有这些都将打印false
,因为其中涉及两个String对象(常量池中的字符串,以及第一行中创建的新字符串)。如果我们分别将它们称为#1和#2,则最终得到:
a = #2 // Explicit call to string constructor
b = #1 // intern will return reference to constant pool instance
c = #2 // Direct assignment
d = #1 // Equivalent string constant, so reference to constant pool instance
但是,您可能会发现这很有趣:
String a = "te";
String b = a.intern();
String c = "t" + "e";
System.out.println(a == b); // true
System.out.println(a == c); // true
"te"
和"t" + "e"
是相等的常量字符串表达式,因此最终只能作为对单个字符串的引用,并且在文字池中已存在的字符串上调用intern
不会产生任何效果。