Es hängt davon ab.
Wenn es nur Konstanten gibt, kümmert sich der Javac darum. Das folgende Programm:
public class Main {
public static void main(String[] args) {
System.out.println("foo"+"bar");
}
}
Schaltet in den folgenden Bytecode (entfernt einige nicht relevante Teile):
public class com/hazelcast/Main {
// access flags 0x9
public static main([Ljava/lang/String;)V
L0
LINENUMBER 9 L0
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
LDC "foobar"
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
L1
LINENUMBER 10 L1
RETURN
L2
LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
MAXSTACK = 2
MAXLOCALS = 1
}
können Sie sehen die foobar Konstante drin. In diesem Fall gibt es keinen Leistungseinbruch.
Allerdings, wenn wir das Programm etwas realistischere ändern würde:
public class Main {
public static void main(String[] args) {
int a = 1;
System.out.println(a+"foo" + "bar");
}
}
Wir erhalten die folgenden Bytecode:
public class com/hazelcast/Main {
// access flags 0x9
public static main([Ljava/lang/String;)V
L0
LINENUMBER 9 L0
ICONST_1
ISTORE 1
L1
LINENUMBER 10 L1
GETSTATIC java/lang/System.out : Ljava/io/PrintStream;
NEW java/lang/StringBuilder
DUP
INVOKESPECIAL java/lang/StringBuilder.<init>()V
ILOAD 1
INVOKEVIRTUAL java/lang/StringBuilder.append (I)Ljava/lang/StringBuilder;
LDC "foo"
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
LDC "bar"
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder;
INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String;
INVOKEVIRTUAL java/io/PrintStream.println (Ljava/lang/String;)V
L2
LINENUMBER 11 L2
RETURN
L3
LOCALVARIABLE args [Ljava/lang/String; L0 L3 0
LOCALVARIABLE a I L1 L3 1
MAXSTACK = 3
MAXLOCALS = 2
}
Wie Sie sehen können, "foo" und "bar" sind nicht automatisch verkettet.
Ich habe keine Ahnung, ob das JIT die unerwünschte Verkettung entfernen kann.
Ich bin zu 99% sicher, dass der Compiler es nur in ein nettes großes String-Literal für Sie verwandelt – Rogue