3

String a = "abc";
String b = "xyz";
String result = a + b;

「結果」文字列は、文字列プールに割り当てられた文字列定数のメモリなのか、ヒープ上に作成された新しいオブジェクトなのか疑問に思いました。

new String()は、permgen文字列プールスペースで上記の例のa、bのようなヒープおよび文字列定数にオブジェクトを作成することを知っています。

4

3 に答える 3

8

重要な注意:

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.
于 2012-08-15T14:14:27.700 に答える
2

コードをコンパイルおよび逆コンパイルすると、次の結果が得られます。

String result = new StringBuilder().append(a).append(b).toString();
于 2012-08-15T14:12:47.933 に答える
0

連結すると、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

于 2012-08-15T14:13:21.380 に答える