I know that \"==\" compare reference and the a java String is immutable and use a string pool cache but I\'m still confusing on this example :
final String
Since fName
is final and initialized with a literal String, it's a constant expression.
So the instruction
String name2 = fName + "Gosling"
is compiled to
String name2 = "James" + "Gosling"
which is compiled to
String name2 = "JamesGosling"
So, in the bytecode, you have the equivalent of
String name2 = "JamesGosling";
String name3 = "JamesGosling";
So both name2 and name3 reference the same literal String, which is interned.
On the other hand, lName
is not final, and is thus not a constant expression, and the concatenation happens at runtime rather than at compile time. So the concatenation creates a new, non-interned String.