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池中?
您的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已经在文字池中的字符串将不会有任何影响.
| 归档时间: |
|
| 查看次数: |
152 次 |
| 最近记录: |