String累加について

3540 ワード

昨日グループでStringの累加について話し合ったが、どのような状況なのか、特に正確に知る人はいないようだ.今日はjclasslib(PS:
http://zangxt.iteye.com/良いものを手に入れた)コンパイラが文字列の累積をどのように行ったかを検出するには、まずコードを書きます.
package francis;  
public class TestString {  
    public static void main(String[]args) {  
        String s = "";  
        for(int i = 0; i < 1000; i++) {  
            s += i;  
        }  
        System.out.println(s);  
    }  
}  

簡単で、ネット上でも大まかな結論が得られるようですが、コンパイルされたコードを自分の手で見てみましょう.
关于String累加
上のプログラムが22行のコードにコンパイルされているのが見えます.6行目から18行目を見てください.これはforループ全体で実行されるコードです.ループのたびに6行目のコードが実行されます.つまり、毎回StringBuilderオブジェクトが新規作成されます.これはどんなにパフォーマンスが浪費されているかが明らかになります.
これは明らかです.文字列の結合のたびに、コンパイラはStringBuilderオブジェクトを新規作成することで完了します.
まあ、コンパイラが十分にスマートで、新しいStringBuilderオブジェクトをループの外に置くと、パフォーマンスの問題を心配する必要はありませんが、コンパイラはまだできないようです.手動でStringBuilderを新規作成するのは良い方法です.
package francis;  
public class TestString {  
    public static void main(String[]args) {  
        String s = "";  
        StringBuilder sb = new StringBuilder(s);  
        for(int i = 0; i < 1000; i++) {  
            sb.append(i);  
        }  
        s = sb.toString();  
        System.out.println(s);  
    }  
}  

本当に効果があるかどうかを確認するために、今回のコンパイル後のコードを見てみましょう.
关于String累加
このループのコードは11~18行で、StringBuilderオブジェクトを作成するには3ステップ目です.これにより、コンパイラがループごとにStringBuilderオブジェクトを新規作成することを回避できます.接続文字列の操作が多いときにStringBuilderオブジェクトを直接手動で新規作成するのが良い習慣です.
StringのパッチはStringBilderオブジェクトを作成するたびに処理されるのかと聞かれるかもしれません.実践は真理を検証する唯一の方法である.
先書きコード:
package francis;  
public class TestString {  
    public static void main(String[]args) {  
        String a = "a" + "b" + "c";  
        String b = a + "b";  
        String c = a + b;  
        System.out.println(a + b + c);  
    }  
} 

それからコンパイルした結果を見てみましょう.長いので、2枚の画像に分けます.
关于String累加
关于String累加
明らかに、4つのnew StringBuilder操作があります.基本的には、文字列接続が必要な場合、使用可能な対応するStringBuilderがなければ新規作成されます.したがって、文字列操作は、コンパイラの最適化に依存することなく、手動でnew StringBuilderに行くことをお勧めします.
もちろん、3行目のコードの後ろにc+=aを追加するなど、他にも多くの場合があります.a+=b;どのような状況が発生しますか?実践は真理を検証する唯一の方法で、自分で検査しましょう~~