はじめに
Javaで文字列をつなげる方法として有名なのが「+
」と「StringBuilder
」。
どちらも使えるけど、「実際どっちがいいの?」という疑問を持つ方も多いはず。
この記事では、「+」と「StringBuilder」の違いと、どのような場面で使い分けるべきかを、初心者にもわかりやすく解説します!
1. Javaの文字列連結、どんな方法があるの?
Javaには複数の方法で文字列をつなげることができますが、ここでは代表的な2つを紹介します。
(1)「+」演算子
一番シンプルな方法です。初学者にもなじみがあります。
1 2 |
String greeting = "Hello, " + "World!"; |
(2)StringBuilderクラス
パフォーマンス重視の現場ではこちらが好まれます。
1 2 3 4 5 |
StringBuilder sb = new StringBuilder(); sb.append("Hello, "); sb.append("World!"); String result = sb.toString(); |
では、この2つの間にはどんな違いがあるのでしょうか?
2. 結論から言うと、使い分けが重要!
条件 | おすすめの方法 |
---|---|
連結する文字列が少ない場合 | + 演算子 |
ループで何回も文字列を連結する場合 | StringBuilder |
マルチスレッド環境で使いたい | StringBuffer (同期あり) |
3. そもそもStringは「不変」なオブジェクト
JavaのString
型は「イミュータブル(不変)」です。つまり、一度作った文字列は変更できません。
1 2 3 |
String str = "Hello"; str += "World"; // 新しい文字列が作られる |
このコードは、元の文字列を変更しているのではなく、新しい文字列オブジェクトを作っているのです。
この特性が、「+」で何度も連結するときにパフォーマンスに影響してくる原因です。
4. 「+」演算子の落とし穴
「+」で文字列を連結するたびに、新しいString
オブジェクトが作成され、前の内容がコピーされます。
例:ループでの連結
1 2 3 4 5 |
String result = ""; for (int i = 0; i < 10000; i++) { result += i; } |
このコード、実は非常に非効率。毎回新しい文字列を作るため、時間もメモリも大量に消費してしまいます。
5. StringBuilderはどう違う?
StringBuilder
は内部に文字列のバッファを持つクラスで、追加・変更が非常に効率的に行えます。
1 2 3 4 5 6 |
StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); } String result = sb.toString(); |
このコードは、前の「+」演算子の例に比べて、圧倒的に速く、メモリ効率も良いです。
6. 性能比較:ベンチマークで見る違い
実際の比較例(10000回ループでの連結):
方法 | 実行時間(参考値) |
---|---|
+ 演算子 | 約0.38秒 |
StringBuilder | 約0.0027秒 |
※ 環境やJVM最適化によって数値は変動しますが、差は10倍以上になることが多いです。
7. Javaのコンパイラの裏側:最適化されることも!
実は、Javaコンパイラはシンプルな「+」演算子を使っている場合、裏で勝手にStringBuilderに変換してくれることがあります。
1 2 |
String message = "Hello" + name + "!"; |
上記は、以下のように変換されます。
1 2 3 4 5 6 |
String message = new StringBuilder() .append("Hello") .append(name) .append("!") .toString(); |
でも注意!
- ループの中の「+」連結は最適化されません!
- 手動で
StringBuilder
を使った方が、安全です。
8. StringBuilder vs StringBufferの違い
特徴 | StringBuilder | StringBuffer |
---|---|---|
スレッド安全 | ✕(非同期) | ○(同期あり) |
処理速度 | 速い | やや遅い |
利用場面 | 単一スレッド処理に最適 | マルチスレッド環境に最適 |
普段はStringBuilder
でOK。マルチスレッドのときだけStringBuffer
を選びましょう。
9. 実践!サンプルコード比較
「+」演算子でのループ連結(非推奨)
1 2 3 4 5 |
String result = ""; for (int i = 0; i < 10000; i++) { result += i; } |
StringBuilderでの連結(推奨)
1 2 3 4 5 6 |
StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) { sb.append(i); } String result = sb.toString(); |
10. よくある質問(FAQ)
Q. なぜ String を不変にしたの?
セキュリティやハッシュの一貫性を保つためです。
変更できる文字列は、トラブルの元にもなりやすいのです。
Q. どのくらいの文字数から StringBuilder にすべき?
明確な境界はありませんが、10回以上の連結があるなら StringBuilder
を使うのがベターです。
Q. Java 17以降で変わることはある?
Java 17でも基本的な原則は同じ。
switch式やパターンマッチングの強化はありますが、文字列連結に関してはStringBuilder
の優位性は変わりません。
まとめ:連結の目的で選び分けよう!
条件 | おすすめ手法 |
---|---|
簡単な連結(数回) | + 演算子 |
ループや大量の文字列処理 | StringBuilder |
マルチスレッド+同期が必要な場合 | StringBuffer |
📘もっとJavaを極めたい人へ
「絶対にJavaプログラマーになりたい人へ。」という書籍では、文字列処理の最適化や、現場での使い方なども丁寧に解説されています。
🎓 実践的な学びは「サイゼントアカデミー」で!
- コードのレビューが受けられる
- Java専門の講師が指導
- 転職サポートも万全!
おわりに
Javaでの文字列連結、実はとても奥が深いんです。
「たかが文字列」と思わずに、目的に合った方法を選ぶことで、コードの品質も、実行速度も、大きく変わります!
ぜひ今日から、目的に応じて「+」とStringBuilder
を使い分けてみてくださいね。
コメント