String.intern是否只是复制Java中的对象引用?

Pie*_*ard 0 java string-interning

是在做:

String a = new String();
String b = a;
Run Code Online (Sandbox Code Playgroud)

并做:

String a = new String();
String b = a.intern();
Run Code Online (Sandbox Code Playgroud)

是一样的吗?

实际上,如果我测试,参考是完全相同的:

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));
Run Code Online (Sandbox Code Playgroud)

因为String将永远在String池中?

Jon*_*eet 5

您的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
Run Code Online (Sandbox Code Playgroud)

但是,您可能会觉得这很有趣:

String a = "te";
String b = a.intern();
String c = "t" + "e";
System.out.println(a == b); // true
System.out.println(a == c); // true
Run Code Online (Sandbox Code Playgroud)

"te"并且"t" + "e"是相等的常量字符串表达式,因此最终作为对单个字符串的引用,并且调用intern已经在文字池中的字符串将不会有任何影响.

  • 字符串文字自动实现,Java编译器将"t"+"e"编译为"te". (3认同)