JLS string concatenation clarification

Remi Forax forax at univ-mlv.fr
Tue Jan 21 17:02:13 PST 2014


On 01/22/2014 01:45 AM, Alex Buckley wrote:
> No, we can't. There are three levels to consider:
>
> - "Real" constant expressions like 3+"". They can avoid creating a new 
> String object per https://bugs.openjdk.java.net/browse/JDK-4836025.
>
> - "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.
>
> - "Not" constant expressions: s+empty. Not detectable in general. 
> Always creates a new String object.
>

and the compiler (javac) emits the instructions to create a new String 
but the VM may not create the String after the code is JITed is the 
String doesn't escape.

> Alex

Rémi

>
> On 1/21/2014 10:41 AM, Martin Buchholz wrote:
>> Can we agree that when
>> String empty = "";
>> then
>> s + empty
>> should be permitted to be the same object as s.
>>
>>
>> On Tue, Jan 21, 2014 at 9:59 AM, Louis Wasserman <lowasser at google.com
>> <mailto:lowasser at google.com>> wrote:
>>
>>     JLS 15.18.1 states:
>>
>>         The |String| object is newly created (§12.5
>> <http://docs.oracle.com/javase/specs/jls/se7/html/jls-12.html#jls-12.5>)
>>         unless the expression is a compile-time constant expression
>>         (§15.28
>> <http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28>).
>>
>>     JLS 12.5 states:
>>
>>         Execution of a string concatenation operator (§15.18.1
>> <http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.18.1>)
>>         that is not part of a constant expression (§15.28
>> <http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.28>)
>>         sometimes creates a new |String| object to represent the result.
>>
>>
>>     It's not clear to me, from reading this, whether string
>>     concatenation with + /always/ creates a new String object or
>>     /sometimes /creates a new String object.  15.18.1 seems to imply
>>     always, but 12.5 says "sometimes."
>>
>>     My understanding is that String.concat used to be used for string
>>     concatenation, and String.concat currently returns its receiver if
>>     its argument is the empty string.  This seems to be evidence for the
>>     "sometimes" interpretation.
>>
>>     --
>>     Louis Wasserman
>>
>>



More information about the compiler-dev mailing list