バグ:文字列の連結で問題はありますか?Java編

Posted: 2013年03月04日

文字列操作(連結)で書いてしまうバグを紹介します。
わかりづらいですが今回はJava編です。

プログラムプログラム:

 public static void main(string []args)
 {
    string src = " ABCDEFG";

    for (int index = 0; index < 100; index++) {
        src += "HIJK";
    }

    // 処理
 }

このプログラムにどのように文字列操作(連結)にバグが存在すると思いますか?

  • 文字列連結を行う場合は、文字列連結クラスを用いて連結を行うほうがパフォーマンスが向上する

改善版プログラム改善版プログラム:

 public static void main(String []args)
 {
    String src = " ABCDEFG";

    StringBuiler strBuilder = new StringBuiler(src);
    for (int index = 0; index < 100; index++) {
        strBuilder.Append("HIJK");
    }
    src = strBuilder.toString();

    // 処理

 }

解説解説:

文字列連結は、StringBuilderまたは、StringBufferを用いることでパフォーマンスが向上します。
通常の連結との違いとしては、
通常の連結では必要な領域の確保を行います。
StringBufferなどは、余分に領域を確保し次の領域確保に備えます。
 連結後にtoStringを行い最適なサイズの文字列を作成します。

領域の確保と解放の処理はコストがかかるため
少ないほうがいいでしょう
StringBuilderとStringBufferの違いは、
スレッドセーフ(マルチスレッド対応済み)かどうかの違いです。
StringBufferがスレッドセーフに実装されています。

スレッドセーフではないStringBuilderは、その分StringBufferよりも高速に動作を行います。
そのためマルチスレッドで使用しない場合は、StringBuilderが適切です。

カテゴリー: バグ, プログラム | タグ: , , | コメント無し »

コメント