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 件のコメント:
コメントを投稿