Java StringBuilderの使い方・文字列の連結
2つ以上の文字列をつなぐことを、文字列の連結(conacation)といいます。
最も簡単な方法は、Stringクラスで+演算子を用いる方法です。
1 2 3 4 5 6 7 8 9 |
public class SampleA { public static void main(String[] args) { String str = "Hello " + "World"; System.out.println(str); } } |
1 |
Hello World |
上記のように問題なく処理が動き、実行結果として出力されていますが、
Stringクラスの文字連結には問題点があります。
それはStringクラスのインスタンスの不変性にあります。
Stringクラスに限らず「インスタンス化の後に内容が絶対に変化しない」よう
設計されたクラスのことを 不変であると言います。
1 2 3 4 5 6 7 8 9 10 |
public class SampleB { public static void main(String[] args) { String str = "Hello "; str = str + "World"; System.out.println(str); } } |
1 |
Hello World |
上記のように一見Stringインスタンスは中身を書き換える事ができるように見えます。
しかし実際は下記のようなことが起きています。
Helloという文字列情報を持ったStiringインスタンスが大きくなり、
“HelloWord”という情報を持つということは決してありません。
演算子にによる(+)連結が行われた場合は、古いインスタンスは捨てられ連結後の情報を
持つ新しいインスタンがnewにより生成されることになります。
簡潔に説明すると+演算子で処理した回数の文字連結は、
内部でその回数分のnewを行っています。
何百回、何千回、何万回と大きくなるにつれて、全体として遅い処理になってしまいます。
その問題を解決するためにStringBuilderを使います。
1 2 3 4 5 6 7 8 9 10 11 12 |
public class SampleC { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); sb.append("Hello "); sb.append("World"); System.out.println(sb.toString()); } } |
1 |
Hello World |
※new String(sb)やString.valueOf(sb)でもString変換が可能です。
処理が高速になるので一般的に推奨されています。
StringBuilderやStringBufferは可変なクラスとして設計されています。
newを使用することなくappend()メソッドで文字列を追記していくこと設計に
なっているので高速に処理をすることが可能です。
StringBufferクラスの利用方法はStringBuilderと全く同じになります。
- String: 不変
- StringBuilder:可変
- StringBuffer: 可変
StringBuilderとStringBufferの違いは、
並列処理を利用しているか利用していないかの場合に使い分けをします。
並列処理とは、複数の処理を同時に行うためのJavaのしくみです。
並列処理を利用している場合に、
StringBuilderクラスを利用すると不具合になる可能性があります。
その為、代わりにStringBufferクラスを使用します。
- StringBuilder:並列処理 ✕
- StringBuffer: 並列処理 ○
この記事へのコメントはありません。