String a = "abc";
String b = "xyz";
String result = a + b;
「結果」文字列は、文字列プールに割り当てられた文字列定数のメモリなのか、ヒープ上に作成された新しいオブジェクトなのか疑問に思いました。
new String()は、permgen文字列プールスペースで上記の例のa、bのようなヒープおよび文字列定数にオブジェクトを作成することを知っています。
String a = "abc";
String b = "xyz";
String result = a + b;
「結果」文字列は、文字列プールに割り当てられた文字列定数のメモリなのか、ヒープ上に作成された新しいオブジェクトなのか疑問に思いました。
new String()は、permgen文字列プールスペースで上記の例のa、bのようなヒープおよび文字列定数にオブジェクトを作成することを知っています。
重要な注意:
String a = "abc";
String b = "xyz";
String result = a + b;
と同じです
// creates a number of objects.
String result = new StringBuilder().append(a).append(b).toString();
しかし
final String a = "abc";
final String b = "xyz";
String result = a + b;
と同じです
String result = "abcxyz"; // creates no new objects.
コードをコンパイルおよび逆コンパイルすると、次の結果が得られます。
String result = new StringBuilder().append(a).append(b).toString();
連結すると、StringBuilderが割り当てられ、連結された文字列が作成されます。
ソース:
public class Hello {
public static final String CONST1 = "cafe";
public static final String CONST2 = "babe";
public static void main(String[] args){
String a = "abc";
String b = "xyz";
String result = a + b;
String result2 = CONST1 + CONST2;
}
}
javapを介して分解:
public class Hello extends java.lang.Object{
public static final java.lang.String CONST1;
public static final java.lang.String CONST2;
public Hello();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2; //String abc
2: astore_1
3: ldc #3; //String xyz
5: astore_2
6: new #4; //class java/lang/StringBuilder
9: dup
10: invokespecial #5; //Method java/lang/StringBuilder."<init>":()V
13: aload_1
14: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
17: aload_2
18: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
25: ldc #8; //String cafebabe
27: astore 4
29: return
}
StringBuilder
文字列a
とを連結するための10行目の割り当てを確認できますb
。CONST1とCONST2の連結は、25行目でコンパイラーによって処理されることに注意してください。したがって、文字列がそうである場合、割り当てfinal
にはなりません。StringBuilder