今回はJavaで文字列の操作をするときに必須となるStringBuilderクラスについて解説していきます。
StringBuilderとは
StringBuilderクラスは文字列の操作に特化したクラスです。
Sringクラスが固定長で不変な文字列である一方で、StringBuilderクラスは可変長で変更可能な文字列を扱います。
StringBuilderクラスの使い方
StringBuilderで文字列をつなげるには以下の手順で行います。
- StringBuilderインスタンスを生成
- appendメソッドで文字列を追加(※)
- toStringメソッドでString文字列へ変換
※newしてインスタンスの生成する時にコンストラクタを使用して文字列を追加することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | public class Sample { public static void main(String[] arg) { // パターン① StringBuilder str1 = new StringBuilder(); str1.append("ディープ"); str1.append("インパクト"); System.out.println(str1.toString()); // パターン②(コンストラクタを使用する場合) StringBuilder str2 = new StringBuilder("サイレンス"); str2.append("スズカ"); System.out.println(str2.toString()); } } |
上記の出力結果は以下の通りです。
1 2 | ディープインパクト サイレンススズカ |
なぜ文字列の結合にStringBuilderクラスを使うのか?
冒頭で紹介した通り、Stringクラスの文字列をつなげるには「+」演算子を使用することが出来ます。
ただし、Stringクラスの文字列は固定長で変更不可能なオブジェクトなので、文字列をつなげるたびに新たなStringクラスのオブジェクトが作られることになります。
一方、StringBuilderクラスは可変長で変更可能な文字列を扱うことを前提としています。同じように文字列をつなげる場合でも、オブジェクト自体の変更が可能です。新たに余分なオブジェクトが作られることがないので、より効率的に文字列の結合が行えて、処理速度もより高速になります。
StringBufferとの違い
StringBuilderクラスと同じように可変文字列を扱うことができるStringBufferクラスとの大きな違いは以下の2点です。
- StringBufferクラスはスレッドセーフだが、StringBuilderクラスはスレッドセーフではない。
- StringBufferクラスよりStringBuilderクラスの方が処理速度が速い。
文字列操作をする場面でマルチスレッドを考慮する機会は多くありません。どちらを使用するか迷ったら、より高速に動作するStringBuilderクラスを選択しましょう。
まとめ
それでは最後に文字列結合とStringBuilderクラスについて、大事なポイントのおさらいです。
- 文字列の結合に「+」演算子を使用するのはイケてない。
- StringBuilderクラスはスレッドセーフではないが実際にマルチスレッドを考慮すべき場面は非常に少ない。
- StringBuilderクラスは文字列結合において最速。
文字列結合が必要なケースは様々ですが、
「とりあえずStringBuilderを使えばOK!」と覚えておいてください。