Search code examples
javastringmemoryheap-memorystring-pool

Difference between + and += on Java Strings


I would like to understand how memory is allocated when we use + and += on Strings in Java. I know that String literals are stored in the String Constant Pool and in Case #1, both s1 and s2 reference the same memory in String Constant Pool.

In Case #2, eventhough I use a + operator, it still references the same object in String Constant Pool

What I find interesting is Case #3. How and where is memory allocated in this case? How is it different from Case #2

//Case #1
String s1 = "Hello Java";
String s2 = "Hello Java";
System.out.println(s1 == s2); //true

//Case #2
s1 = "Hello" + " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //true

s1 = "Hello";
s1 += " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //false

Solution

  • This isn't actually a difference between + and +=; you'd get the same behavior as Case #3 if you wrote:

    s1 = "Hello";
    s1 = s1 + " Java";
    s2 = "Hello Java";
    System.out.println(s1 == s2); //false
    

    The reason for the behavior you see in Case #2 is that "Hello" + " Java" is a constant expression [JLS8 §15.28], so it can actually be handled at compile-time exactly as if it were "Hello Java", and is required to be interned just as "Hello Java" is.

    When you break it up into separate statements, that's no longer the case, so you get a newly created string [JLS8 §15.18.1].