Java言語で繰り返し処理で文字列結合を行う場合は、Stringを使うよりもStringBuffer/StringBuilderを使う方が処理が速くなります。(単一スレッドの場合は、StringBuilderの方が高速)
今回は、文字列結合処理でString、StringBuffer、StringBuilderでどれぐらい処理時間に差が出るのかを調べました。
・実行環境
OS : Windows XP Pro SP3
CPU : Intel Core 2 Duo E8400(GIGABYTEのDES Advanced有効)
Java : JDK6u20
実験ソース:StringTest4.java
1回の処理で1000回文字列を結合する繰り返しを10000回行う時間を測定します。
それを10回行い平均をとりました。
・結果 平均(合計)(単位は、ms)
String | StringBuffer | StringBuilder |
---|---|---|
9920.4(99204) | 464.0(4640) | 218.8(2188) |
・結論
StringBufferよりもStringBuilderの方が約2倍速い。
なぜ、StringBuilderの方がStringBufferよりも速いのか。それは、StringBufferは、スレッドセーフにするために同期処理を行うためです。一方StringBuilderは、同期処理を省略しているため、StringBufferよりも処理が速くなります。
なぜ、Stringの文字列結合は遅いのか。Javaの場合、String型は不可変のオブジェクトです。そのため、文字列の結合を行う場合は、元の文字列のオブジェクトと追加する文字列のオブジェクトを結合した新しいオブジェクトを作り、変数に代入することになります。このオブジェクト生成に時間がかかってしまうのです。
関連:
Java:文字列比較の実行速度の比較
Java:空文字列判定の実行速度の比較