java字符串连接和实习

wli*_*i75 6 java string-concatenation string-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
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,我理解它是两个字符串文字的串联,因此结果"我爱Java"将被实习,结果为真.但是,我不确定第二种情况.

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

以上返回false,但如果我注释掉第1行和第2行,则返回true.这是为什么?

das*_*ght 7

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

"I Love" + " Java"
Run Code Online (Sandbox Code Playgroud)

"I Love Java"
Run Code Online (Sandbox Code Playgroud)

是两个相同的字符串文字,它们得到适当的实习.

同样的实习行为并不能适用于+=操作的字符串,所以b1b2在运行时实际构建.

第二部分比较棘手.回想一下,b1.intern()可能会返回b1String与其相等的其他对象.当你保持a1并且a2,你a1从电话回来b1.intern().当你注释掉a1a2,没有要返回任何现有副本,所以b1.intern()给你回b1自己.