5

Java がプリミティブ型の定数折りたたみをサポートしていることがわかりましたが、Strings はどうでしょうか。

次のソースコードを作成すると

out.write(""
        + "<markup>"
        + "<nested>"
        + "Easier to read if it is split into multiple lines"
        + "</nested>"
        + "</markup>"
        + "");

コンパイルされたコードには何が入りますか?

合体バージョン?out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

それとも、効率の悪いランタイム連結バージョンですか?out.write(new StringBuilder("").append("<markup>").append("<nested>").append("Easier to read if it is split into multiple lines").append("</nested>").append("</markup>").append(""));

4

3 に答える 3

16

簡単なテストは次のとおりです。

public static void main(final String[] args) {
    final String a = "1" + "2";
    final String b = "12";        

    System.out.println(a == b);
}

出力:

true

したがって、はい、コンパイラはフォールドします。

于 2011-12-20T20:54:55.783 に答える
2

組み合わせたバージョンが使用されます。
コンパイラはこれを自動的に最適化し、文字列プールに配置します。

この行を書くことで、この振る舞いを簡単に証明できます。

System.out.println("abc" == "a" + ("b" + "c")); // Prints true

これがtrueと出力されるということは、それが同じオブジェクトであることを意味します。これは2つの理由によるものです。

  1. "a" + ("b" + "c")に最適化されたコンパイラ"abc"
  2. コンパイラは、すべての文字列リテラルを文字列プールに入れます。この動作は文字列インターニングと呼ばれます。
于 2011-12-20T20:55:16.337 に答える
-1

これは効果的に次のように変換されます。 out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

于 2011-12-20T20:54:52.500 に答える