JLS string concatenation clarification

Sergey Bylokhov Sergey.Bylokhov at oracle.com
Wed Feb 12 09:47:25 PST 2014


Hi, Alex.
Just to clarify " a new String is always created for a + ". How many 
String objects should be created in such code from specification point 
of view:
String a,b,c; // locals variables
1) String s = a + b +c;  // One line
or
2) String s=a; s+=b; s+=c; // One line


On 2/12/14 8:28 AM, Alex Buckley wrote:
> On 1/22/2014 2:14 PM, Alex Buckley wrote:
>> On 1/21/2014 4:45 PM, Alex Buckley wrote:
>>> - "Semi" constant expressions like s+"". Concatenating the empty string
>>> literal "" with a String expression is mentioned in
>>> https://bugs.openjdk.java.net/browse/JDK-4036535. The expectation (per
>>> JLS1) that a new String object is always created in this case is
>>> misplaced (per the JDK's actual behavior). But, the JLS never clarified
>>> this.
>>
>> If compiler authors can confirm (on-list or privately) that indeed
>> "concatenation with empty string does not create the new instance of
>> String", then I will clarify the JLS.
>
> On reflection, I wonder if the "sometimes" in JLS1 12.5 was written at 
> a point in history when the JDK didn't always create a new String for 
> +, at least when "" was an operand. After all, JDK-4036535 has 
> evidence that a JDK once arranged for ""+s1 == s1.
>
> (An alternate theory is that "sometimes" refers to the creation of 
> some other String object, such as an intermediate result of string 
> conversion. But that's very subtle.)
>
> Nowadays, javac and ecj both use a StringBuilder method chain, 
> culminating in a toString() call that ensures a new String object 
> every time. The "sometimes" is wrong and I have filed spec bug 
> JDK-8034259.
>
> Alex
>


-- 
Best regards, Sergey.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20140212/732a0c6c/attachment.html 


More information about the compiler-dev mailing list