是在做:

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不会产生任何效果。

10-04 20:36