1

As per the following How Java String pool works when String concatenation? conversation,

String a = "hello world!"; String b = "hello" + " world!"; boolean compare = (a == b); 

The compare should be true which is correct. However, I've the following code

String s1 = "This is"; String s2 = " a new String"; String s3 = s1 + s2; String s4 = "This is a new String"; 

On comparing System.out.printf("s3 == s4:%s\n", s3 == s4);//always false It is always false. My understanding is that on concatenation of s1 & s2, s3 will create a string in pool and when s4 is created it will point to the same pool location. But this is not the case. I've tried this with different JDKs including 7, 8 and 14 and the results are consistent.

1
  • 1
    "s3 will create a string in pool" no. Runtime-evaluated strings are only added to the pool if you explicitly request it, with intern(). Commented May 4, 2020 at 9:28

1 Answer 1

3

This is how the behaviour regarding pooling strings is specified in the Java Language Specification (emphasis mine):

3.10.5 String Literals

[...]

Moreover, a string literal always refers to the same instance of class String. This is because string literals - or, more generally, strings that are the values of constant expressions (§15.28) - are "interned" so as to share unique instances, using the method String.intern.

Only constant expressions of type String are pooled. "This is a new String", and "hello" + " world!" are constant expressions. The compiler can evaluate these expressions at compile time. s1 + s2 is not a constant expression.

So when executing s1 + s2, a new string is created. But note that another string, which just so happens to have the same characters as the new string, is in the string pool, because you used a string literal to initialise s4.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.