2011-12-20 9 views
5

Java supports constant folding of primitive typesが見つかりましたが、約StringJavaコンパイラにはString Constant Foldingが含まれていますか?

私は次のソースコードにコンパイルされたコードに入る何

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>");

ランタイム・コンカチネーションのバージョンがそれほど効率が悪いですか?

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

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

出力::ここで簡単にテストだ out.write("<markup><nested>Easier to read if it is split into multiple lines</nested></markup>");

+0

文字列連結は、デバイスへの書き込みよりも約100倍高速です。それは本当に大したことではない(それはありません) –

+0

私はちょうど私のラップトップで、その50倍遅くテストしました。 –

+1

これは実際にはJLSによって要求される動作です。 /生成されたコードは 'javap -c'で見ることができます。 –

答えて

14

:それが効果的に変換out.write(new StringBuilder("").append("<markup>").append("<nested>").append("Easier to read if it is split into multiple lines").append("</nested>").append("</markup>").append(""));

-1

ので

true 

、はい、コンパイラが折り畳まれます。

1

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

この行を書くことで、この動作を簡単に証明できます。これが本当印刷される

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

、それは同じオブジェクトであることを意味します。コンパイラは​​に"a" + ("b" + "c")を最適化

  1. :それは理由の二つのことです。
  2. コンパイラは、すべての文字列リテラルを文字列プールに配置します。この現象はString Interningと呼ばれます。
+1

この動作の最初の部分は、定数式評価と呼ばれます。 – EJP

関連する問題