java 字符串连接和实习

java string concatenation and interning

问题 1

String a1 = "I Love" + " Java";
String a2 = "I Love " + "Java";
System.out.println( a1 == a2 ); // true

String b1 = "I Love";
b1 += " Java";
String b2 = "I Love ";
b2 += "Java";
System.out.println( b1 == b2 ); // false

在第一种情况下,我理解它是两个字符串文字的串联,因此结果 "I Love Java" 将被保留,给出结果 true。但是,我不确定第二种情况。

问题 2

String a1 = "I Love" + " Java"; // line 1
String a2 = "I Love " + "Java"; // line 2

String b1 = "I Love";
b1 += " Java";
String b2 = "I Love ";
b2 += "Java";
String b3 = b1.intern();
System.out.println( b1 == b3 ); // false

上面的returns是假的,但是如果我注释掉第1行和第2行,它returns是真的。这是为什么?

你的问题的第一部分很简单:Java 编译器将多个字符串文字的串联视为单个字符串文字,即

"I Love" + " Java"

"I Love Java"

是两个相同的字符串文字,它们被正确地嵌入。

相同的驻留行为 not 适用于字符串的 += 操作,因此 b1b2 实际上是在 运行-次.

第二部分比较棘手。回想一下 b1.intern() 可能 return b1 或与它相等的其他 String 对象。当您保留 a1a2 时,您会从对 b1.intern() 的调用中返回 a1。当您注释掉 a1a2 时,没有要编辑的现有副本 return,因此 b1.intern() 还给您 b1 本身。

来自 intern() 文档

All literal strings and string-valued constant expressions are interned. String literals are defined in section 3.10.5 of the The Java™ Language Specification.

JLS 3.10.5

  • Strings computed by constant expressions (§15.28) are computed at compile time and then treated as if they were literals.
    • Strings computed by concatenation at run time are newly created and therefore distinct.

您的字符串 b1 并未实际实习。因此差异。