Stringと StringBufferクラスの比較 - 文字列の連結を効率的に行うには

2008/10/08 17:54Update
TAGS: String | StringBuffer | 文字列 | 効率 | パフォーマンス

適当な方法で文字列の連結を行うことで、パフォーマンスが大きく向上させることができます。本文はStringと StringBufferの相違点、効率的に文字列の連結させる方法について解説します。

Stringと StringBufferどこが違うか


まず、Stringの +演算子で文字列の連結を行う際、何かが起こったのかを検証します。
簡単なサンプルから見てみます。

TestString.java
public 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.java
public 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

20000回文字列の連結で、Stringの+演算子の場合、39秒もかかりましたが、StringBuffer.appendメソッドを利用すると、ほとんど掛かりません。

文字列の連結を効率的に行えるために、なるべくStringBufferクラスを使いましょう。

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments

用户名 (required)

Email (will not be published) (required)

URL

Evaluation