问题一
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
上面返回false,但是如果我注释掉第1行和第2行,它返回true。这是为什么?
最佳答案
问题的第一部分很简单:Java 编译器将多个字符串文字的串联视为单个字符串文字,即
"I Love" + " Java"
和
"I Love Java"
是两个相同的字符串文字,它们被正确地驻留。
相同的驻留行为不适用于字符串的+=
操作,所以b1
和b2
是实际上是在运行时构建的。
第二部分比较棘手。回想一下,b1.intern()
可能会返回 b1
或与其相等的其他一些 String
对象。当您保留 a1
和 a2
时,您会从对 b1.intern()
的调用中得到 a1
。当您注释掉 a1
和 a2
时,没有要返回的现有副本,因此 b1.intern()
返回给您 b1
本身。
关于java字符串连接和实习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45165496/