Stringと StringBufferクラスの比較 - 文字列の連結を効率的に行うには
2008/10/08 17:54Update
適当な方法で文字列の連結を行うことで、パフォーマンスが大きく向上させることができます。本文はStringと StringBufferの相違点、効率的に文字列の連結させる方法について解説します。
Stringと StringBufferどこが違うか
まず、Stringの +演算子で文字列の連結を行う際、何かが起こったのかを検証します。
簡単なサンプルから見てみます。
TestString.javapublic class TestString {
public static void main(String []args) {
String s = new String("Hello World! こんにちは、");
System.out.println(s); //① sを確認する。「break point 」
s = s + "Java!";
System.out.println(s); //② sを確認する。「break point」
}
}
上のJavaコードをEclipseなどのIDEで「break point」を設置してからデバッグモードで起動させます。
筆者はEclipseを使うので、以下はEclipse環境での確認方法から解説します。
1)まず、EclipseIDEの①、②のところで、ブレークポイントを設置します。
2)メニューの「実行」>「デバッグ」>「Javaアプリケーション」から起動します。
3)ブレークポイントを設置したので、①で示したところで、「変数」ウィンドウで変数 s を確認します。
s="Hello World! こんにちは、"
∟count=19
∟hash=0
∟offset=0
∟value=char[19] (ID=25)
4)引き続き実行させます。②で示したところで、「変数」ウィンドウで変数 s を再び確認します。
s="Hello World! こんにちは、Java!"
∟count=24
∟hash=0
∟offset=0
∟value=char[24] (ID=28)
s.valueのID=25からID=28に変わったことを確認しました。
即ち、
String s = new String("Hello World! こんにちは、");
s = s + "Java!";
のようなコードで文字列の連結を行う際、2つのオブジェクトが作られている証拠です。
文字列の連結を大量発生する場合、Stringクラスを使うと、効率が悪いです。
一般的に、文字列の連結を大量発生する必要がある場合、StringBufferクラスを使ったほうがよい。
文字列の連結処理を効率的に行うには
次は、Stringの + 演算子でどこまで効率が悪いかを検証しましょう。
TestString.javapublic class TestString {
public static void main(String []args) {
StringBuffer sb = new StringBuffer("Hello World");
String str = "Hello World";
//String + で文字列の連結
long timeStart = System.currentTimeMillis();
for (int i=0; i<20000; i++) {
str += "1111+";
}
long timeEnd = System.currentTimeMillis();
System.out.println(timeEnd - timeStart);
//StringBufferの appendメソッドで文字列の連結
timeStart = System.currentTimeMillis();
for (int i=0; i<20000; i++) {
sb.append("1111+");
}
timeEnd = System.currentTimeMillis();
System.out.println(timeEnd - timeStart);」
}
}
実際に実行したところ、次のような結果が得られました。
c:\javac TestString.java
c:\java TestString
39000
0
c:\java TestString
39000
0
20000回文字列の連結で、Stringの+演算子の場合、39秒もかかりましたが、StringBuffer.appendメソッドを利用すると、ほとんど掛かりません。
文字列の連結を効率的に行えるために、なるべくStringBufferクラスを使いましょう。
Sponsored Link
Comments
- Relative Articles
- Class.forName/newInstance - 文字列からインスタンスを生成 - (2009/02/12 18:12)
- Java文字列処理 - Stringクラス - (2008/10/08 11:59)
- Java特殊文字処理 - エスケープシーケンス - (2008/10/08 14:56)
- Java文字列処理 - StringBufferクラス - (2008/10/08 17:01)
- JavaでString と byte配列のとの相互変換 - (2008/10/14 18:35)
- サンプルから学ぶJava言語の Boolean/String/boolean型の変換 - (2009/02/20 11:31)
- JavaでString文字列が等しいかどうかの判定 - (2009/02/23 13:41)
- String.splitで正規表現によるString文字列の分割 - (2009/03/04 14:24)
- StringTokenizerでString文字列の分割 - (2009/03/04 15:18)
- 文字列のフォーマット - MessageFormatよくある使い方 - (2009/03/05 14:45)