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クラスを使用します。
この記事へのコメントはありません。