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 适用于字符串的 +=
操作,因此 b1
和 b2
实际上是在 运行-次.
第二部分比较棘手。回想一下 b1.intern()
可能 return b1
或与它相等的其他 String
对象。当您保留 a1
和 a2
时,您会从对 b1.intern()
的调用中返回 a1
。当您注释掉 a1
和 a2
时,没有要编辑的现有副本 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.
- 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 并未实际实习。因此差异。
问题 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 适用于字符串的 +=
操作,因此 b1
和 b2
实际上是在 运行-次.
第二部分比较棘手。回想一下 b1.intern()
可能 return b1
或与它相等的其他 String
对象。当您保留 a1
和 a2
时,您会从对 b1.intern()
的调用中返回 a1
。当您注释掉 a1
和 a2
时,没有要编辑的现有副本 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.
- 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 并未实际实习。因此差异。