接合文字列の効率の問題

7104 ワード

public class StringTest
{
public static void main(String[] args)
{
long start = System.currentTimeMillis();
String s
= new String("hello");
for (int i = 0; i < 15000; i++)
{
s
+=i;
}
long end = System.currentTimeMillis();
long time = end -start;
System.
out.println(" String += "+time);

long start1 = System.currentTimeMillis();
StringBuffer sb
= new StringBuffer("hello");
for (int i = 0; i < 15000; i++)
{
sb.append(i);
}
long end1 = System.currentTimeMillis();
long time1 = end1 -start1;
System.
out.println(" StringBuffer append "+time1);

long start2 = System.currentTimeMillis();
StringBuilder builder
= new StringBuilder("hello");
for (int i = 0; i < 15000; i++)
{
builder.append(i);
}
long end2 = System.currentTimeMillis();
long time2 = end2 -start2;
System.
out.println(" StringBuilder append "+time2);
}
}

String
+= 3984
StringBuffer append 31
StringBuilder append 0

  
もちろんこの時間はあなたのコンピュータの速度に依存しますが、BufferとBuildrはほとんど違いません.Stringはずっと遅い原因があります.プログラムのバイトコードを見ると、Stringクラス自体がfinalタイプなので、彼は変更できません.そのため、つなぎ合わせるときにStringBufferを使用してappendを呼び出し、その後toStringメソッドを呼び出します.毎回そうします.StringBufferがStringに再変換された場合、代価は大きい.これは遅い主な原因です.テンポラリオブジェクトStringBufferを創設しただけでなく、毎回終了後にStringに移行します.StringBuilderの出現はStringBufferを置き換えるために使用されるので、できるだけStringBuilderでつなぎ合わせるべきで、Stringに移行する数を最小限に抑え、オブジェクトの作成数を減らし、パフォーマンスを大幅に向上させる.