Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのStringBuilderとStringBufferを徹底比較!実行速度から見る使い分けのポイント

StringBuilderとStringBufferの違いとは?

StringBufferは、複数のスレッドが同時に同じオブジェクトへアクセスする可能性があるマルチスレッド環境でも安全に使用できるクラスです。内部のメソッドが同期化(synchronized)されているため、スレッド間でのデータ競合が発生しません。

一方、StringBuilderは、スレッドセーフなStringBufferクラスの代替としてJava 5で導入されたクラスです。synchronizedメソッドを持たないため、その分オーバーヘッドがなく、はるかに高速に動作します。単一スレッド内で文字列の連結や編集など大量の文字列操作を行う場合には、StringBuilderを使うことで大きなパフォーマンス向上が期待できます。

主な違いのまとめ

項目StringBufferStringBuilder
スレッドセーフ性あり(同期化済み)なし
パフォーマンスやや低速高速
推奨される場面マルチスレッド環境シングルスレッド環境
導入バージョンJava 1.0Java 5以降

実行速度を比較するサンプルコード

それでは、両クラスの処理速度を実際に計測して比較してみましょう。以下のコードでは、System.nanoTime()を使って、各クラスで1000回の文字追加(append)にかかる時間をナノ秒単位で測定しています。

public class CompareBuilderwithBufferTest {
    public static void main(String []args) {
        stringBufferTest();
        stringBuilderTest();
    }
    public static void stringBufferTest() {
        long startTime = System.nanoTime();
        StringBuffer sb = new StringBuffer();
        for (int i=0; i < 1000; i++) {
            sb.append((char) 'a');
        }
        System.out.println("StringBufferテスト: " + (System.nanoTime() - startTime));
    }
    public static void stringBuilderTest() {
        long startTime = System.nanoTime();
        StringBuilder sb = new StringBuilder();
        for (int i=0; i < 1000; i++) {
            sb.append((char) 'a');
        }
        System.out.println("StringBuilderテスト: " + (System.nanoTime() - startTime));
    }
}

実行結果

StringBufferテスト: 192595
StringBuilderテスト: 85733

結果の考察

この実行例では、StringBufferの処理時間が約192,595ナノ秒だったのに対し、StringBuilderは約85,733ナノ秒と、2倍以上の速度差が確認できました。これは、StringBufferが毎回スレッドのロック・アンロック処理を行うのに対し、StringBuilderはその同期処理を省略しているためです。

ただし、計測結果は実行環境やJVMの状態によって変動します。あくまで傾向として、「シングルスレッドならStringBuilder、マルチスレッドならStringBuffer」という使い分けが基本となります。近年では、マルチスレッド環境下でも不変(immutable)なStringクラスや並列処理向けの仕組みを活用することで、StringBufferの出番は限られてきています。

  1. Javaで編集可能なJLabelを実装する方法

    JLabelとはJLabelクラスはJComponentクラスを継承しており、JLabelのオブジェクトを使用することで、GUI上にテキストによる説明や情報を表示できます。JLabelの主な特徴は以下のとおりです。1行の読み取り専用テキスト、画像、またはその両方を表示できる重要なメソッドとして、setText()、setIcon()、setBackground()、setOpaque()、setHorizontalAlignment()、setVerticalAlignment()などが用意されているPropertyChangeListenerインターフェースを明示的に登録して、プロパティの変

  2. JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説

    JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー