2026年1月21日水曜日

【Java】String, StringBuilder, StringBuffer どう使い分ける?特徴と速度の決定的な違い

 Javaプログラミングで避けては通れない「文字列操作」。 String だけでもなんとなく動きますが、実は裏側ではメモリや速度の面で大きな違いがあります。今回は、主要3クラスの「できること・できないこと」を徹底比較します。


1. String:基本にして最強の「不変」クラス

Javaの String「不変(Immutable)」 という最大の特徴を持っています。

  • できること: 直感的な結合(+ 演算子)、定数プールによるメモリ節約。

  • できないこと: 内容の直接書き換え。

  • 注意点: 一度作った String は変更できません。s += "abc" と書くたびに、古い文字列が捨てられ、新しいメモリ領域に新しい文字列が作られています。 数千回のループでこれを行うと、メモリが不足し、動作が劇的に重くなります。



2. StringBuilder:速度重視の「可変」クラス

「文字列をどんどん追加したい」という場面の第一選択です。

  • できること: 高速な連結(append)、文字列の挿入・削除・反転。

  • できないこと: 複数のスレッドからの同時操作(スレッドセーフではない)。

  • 速度: 3クラスの中で最速です。

  • 注意点: 実務のほとんどの場面(1つのメソッド内で完結する処理など)では、これを使うのがベストプラクティスです。



3. StringBuffer:安全第一の「歴史ある」クラス

Javaの初期から存在するクラスで、StringBuilder の安全版という位置づけです。

  • できること: StringBuilder とほぼ同じ。かつ、スレッドセーフ(同期化)

  • できないこと: StringBuilder 以上の速度。

  • 注意点: 同期化(排他制御)の仕組みがあるため、その分だけ StringBuilder よりも処理が重くなります。複数スレッドで1つの文字列を共有する特殊な状況以外では、出番は少なくなっています。




4. 【比較表】ひと目でわかる使い分け


クラス名変更の可否スレッド安全速度主な使い道
String不可 (不変)――短い文字列、定数、Mapのキーなど
StringBuilder可能 (可変)×最速ループ内での結合、複雑な編集
StringBuffer可能 (可変)普通マルチスレッド環境での共有


5. 速度検証:なぜ「+」連結は遅いのか?


1万回のループで文字列を連結した場合、以下のような差が出ることが一般的です。

  • String (+ 演算子) : 数秒〜(データ量に比例して遅くなる)

  • StringBuilder : 数ミリ秒

なぜこれほど差が出るのか?

String の連結は、内部で毎回「新しい配列の確保」と「データのコピー」を行っています。一方、StringBuilder はあらかじめ余裕を持ったメモリ空間(バッファ)を確保し、そこを書き換えていくため、コピーの回数が圧倒的に少なくて済むのです。




0 件のコメント:

コメントを投稿

【Java】数学の「ラムダ表現」から学ぶJavaラムダ式の実装と制限

Java 8で導入された「ラムダ式」。そのルーツは数学の「ラムダ計算」にあります。数学的な美しさと、Javaの実装における具体的なメリット・制限を整理して解説します。 1. 数学におけるラムダ表現 通常、関数は $f(x) = x + 1$ のように名前を付けて定義しますが、ラ...