Question 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
In the first case, I understand that it is a concatenation of two string literals, so the result "I Love Java" will be interned, giving the result true. However, I'm not sure about the second case.
Question 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
The above returns false, but if I comment out lines 1 and 2, it returns true. Why is that?
The first part of your question is simple: Java compiler treats concatenation of multiple string literals as a single string literal, i.e.
"I Love" + " Java"
and
"I Love Java"
are two identical string literals, which get properly interned.
The same interning behavior does not apply to +=
operation on strings, so b1
and b2
are actually constructed at run-time.
The second part is trickier. Recall that b1.intern()
may return b1
or some other String
object that is equal to it. When you keep a1
and a2
, you get a1
back from the call to b1.intern()
. When you comment out a1
and a2
, there is no existing copy to be returned, so b1.intern()
gives you back b1
itself.