Javaの文字列について書きます。
StringとStringBuilder
Javaの文字列ですが、大きく分けると
- String
- StringBuilder
の2つのクラスに分かれます。(他にもStringBufferもありますが、とりあえず割愛。)
文字列の追加はStringBuilder
文字列の使い分けですが更新や追加を頻繁におこうなうような文字列の場合はStringBuilderを使います。
これはStringが一度生成されると変更がされないインスタンスなため、値の編集には向きません。文字列の連結などをする場合、新しい文字列を内部に作っているため、メモリを浪費します。
a=a+bのような結合をStringで行った場合、aを確保してあったメモリは固定長のため破棄され、bを追加して、新たな領域を確保しなくてはいけないからです。
悪い例
1 2 3 |
String str = "abc"; str +="def"; str +="ghi"; |
この点、StringBuilderは値の更新が可能なため、メモリの節約に向いており、高速で処理を行うことができます。このため文字列の追加にはStringBuilderを使いましょう。
1 2 3 4 |
StringBuilder sb = new StringBuilder(); sb.append("abc"); sb.append("def"); sb.append("ghi"); |
文字列の参照はString
逆に更新されない文字列(主に値の設定と参照と破棄)に対してはStringを使います。
StringBuilderなどで更新された文字列をインスタンス内に格納するときなどはtoStringでStringにして設定をします。
1 2 3 4 5 6 |
StringBuilder sb = new StringBuilder(); sb.append("abc"); sb.append("def"); sb.append("ghi"); String str = sb.toString(); |
補足しておくと、Stringは固定長というわけではなく、不変オブジェクトです。
一度生成されたインスタンスは二度と変更されないということですね。だから、+演算子で連結すると、新しいインスタンスが作られるということになります。
コメントありがとうございます。
こちら参考にしたブログの記述をあやまって解釈しておりました。
修正させていただきます。