4

私がこのString表現を持っているとしましょう

String hi = "Tom" + "Brady" + "Goat"

String プールは、「プール内の不変の文字列を保持することで、ランタイムがメモリを節約できるようにする」ことを知っています。String Pool

文字列プールにはいくつの文字列が作成されますか?

私の最初の推測は 5 - "Tom", "Brady", "Goat", "TomBrady",連結"TomBradyGoat"操作の順序String(左から右?) のためですか、それとも String プールに格納されるのは最終結果 "TomBradyGoat" だけですか?

4

4 に答える 4

3

実行時に、そのコードは単一のStringオブジェクトに変換されます。コンパイラはコンパイル時に連結を処理し、定数プールに単一の値を追加します。

于 2015-02-25T21:09:26.453 に答える
2

他の回答は、文字列プールに 1 つの文字列のみが追加される理由をよく説明しています。ただし、自分でいくつかのテストを確認して作成したい場合は、バイトコードを調べて、作成され、文字列プールに追加された文字列の数を確認できます。元:

例1:

public static void main(String[] args) {
    String hi = "Tom" + "Brady" + "Goat";
}

バイトコード:

  // access flags 0x9
  public static main(String[]) : void
   L0
    LINENUMBER 6 L0
    LDC "TomBradyGoat"
    ASTORE 1
   L1
    LINENUMBER 7 L1
    RETURN
   L2
    LOCALVARIABLE args String[] L0 L2 0
    LOCALVARIABLE hi String L1 L2 1
    MAXSTACK = 1
    MAXLOCALS = 2

ご覧のとおり、文字列は 1 つだけ作成されます

例2:

public static void main(String[] args) {
        String str1 = "Tom";
        String str2 = "Brady";
        String str3 = "Goat";
        String str = str1 + str2 + str3;
}

バイトコード:

  // access flags 0x9
  public static main(String[]) : void
   L0
    LINENUMBER 6 L0
    LDC "Tom"
    ASTORE 1
   L1
    LINENUMBER 7 L1
    LDC "Brady"
    ASTORE 2
   L2
    LINENUMBER 8 L2
    LDC "Goat"
    ASTORE 3
   L3
    LINENUMBER 9 L3
    NEW StringBuilder
    DUP
    ALOAD 1: str1
    INVOKESTATIC String.valueOf (Object) : String
    INVOKESPECIAL StringBuilder.<init> (String) : void
    ALOAD 2: str2
    INVOKEVIRTUAL StringBuilder.append (String) : StringBuilder
    ALOAD 3: str3
    INVOKEVIRTUAL StringBuilder.append (String) : StringBuilder
    INVOKEVIRTUAL StringBuilder.toString () : String
    ASTORE 4
   L4
    LINENUMBER 10 L4
    RETURN
   L5
    LOCALVARIABLE args String[] L0 L5 0
    LOCALVARIABLE str1 String L1 L5 1
    LOCALVARIABLE str2 String L2 L5 2
    LOCALVARIABLE str3 String L3 L5 3
    LOCALVARIABLE str String L4 L5 4
    MAXSTACK = 3
    MAXLOCALS = 5

ご覧のとおり、4 つのストリングが作成されます

于 2015-02-25T21:34:31.820 に答える
-1

他の人が言及しているように、コンパイラはその非常に単純な例を最適化するのに十分ですが、より複雑な機能 (おそらくあなたが気にかけていること) がある場合は、そうではないかもしれません。例えば:

String a = "Tom";
String b = "Brady";
String c = a;
c += b;

これにより、3 つの文字列が作成されます。

于 2015-02-25T21:13:47.500 に答える