StringBuilderを理解する
StringBuilderは文字の並びを編集できるオブジェクトです。追記、挿入、削除のたびに内容が変わるので、同じオブジェクトを指す参照と、toStringで得たStringを区別して追跡します。
この単元で学ぶこと
- StringBuilderの編集操作と範囲を求める
- 共有参照とメソッド連鎖を説明する
- length・capacity・Stringへの変換を区別する
本文解説
編集できる文字の入れ物 StringBuilder b=new StringBuilder("ab");b.append("c");でbの内容はabcになります。Stringのconcatと異なり、appendの戻り値を受け取らなくても変更されます。同じ一連の処理で文字を繰り返し組み立てる場合に使えます。StringBuilderはStringの下位型ではなく、必要ならtoString()でStringへ変換します。
appendと戻り値 appendは末尾へ追加し、このStringBuilder自身を返します。b.append("A").append(2);ならまずA、次に2を追加します。戻り値が同じオブジェクトなので連鎖できます。new StringBuilder().append(1+2)は3、append(1).append(2)は12です。引数内の数値計算と複数回の追加を区別します。
挿入と一文字の変更 new StringBuilder("ac").insert(1,"b")は、位置1のcの手前にbを入れてabcになります。insert(length(),"!")は末尾への挿入です。setCharAt(0,'Z')は位置0の一文字を置き換え、長さは変わりません。setCharAtはvoidを返すため、その後ろへappendを連鎖することはできません。
削除と置換の境界 b=new StringBuilder("ABCDE")にdelete(1,4)を適用するとBCDを削除してAEになります。終了位置は含めません。replace(1,4,"x")ならBCDをxへ置換してAxEです。開始位置が無効なら例外ですが、deleteの終了が長さを超える場合は末尾まで削除します。String.substringと同じ境界検査だと決めつけません。
参照の共有とfinal StringBuilder a=new StringBuilder("x");StringBuilder b=a;a.append("y");ではbから見てもxyです。同じ可変オブジェクトを共有しています。final StringBuilder aでもappendは可能です。finalが禁止するのはa=new StringBuilder()のような参照の再代入で、オブジェクトの編集ではありません。
Stringへの変換と部分文字列 StringBuilder b=new StringBuilder("ab");String s=b.toString();b.append("c");の後、sはabでbはabcです。変換済みのStringは後の編集を追跡しません。またb.substring(1)の戻り値はStringであり、元のBuilderは短くなりません。編集メソッドと読取りメソッドを戻り値の型でも区別します。
長さと容量 length()は現在の文字数、capacity()は追加に備えて保持する容量です。new StringBuilder(20)の長さは0で容量は20です。new StringBuilder("abc")の容量は初期文字数3に16を加えた19です。容量が十分でも内容が自動的に空白で埋まるわけではありません。ensureCapacityも内容の長さを増やす操作ではありません。
長さの変更と利用範囲 setLength(2)は長い内容を2文字へ切り詰め、逆に長くすると追加部分を\u0000で埋めます。表示される空白ではなく値0のcharです。reverse()は文字の並びを反転します。StringBuilderは同期を保証しないため、ここでの例は一つのスレッドで扱います。複数スレッドの安全性や実行速度を無条件に保証する説明にはしません。
図解
重要ポイント
- append・insert・deleteは内容を変更する。
- toStringとsubstringはStringを返す。
- 同じBuilderへの参照から編集結果が見える。
- 容量と文字列の長さは異なる。
間違えやすい点
- setCharAtの戻り値はvoid。
- finalでも内容の編集はできる。
- equalsで内容一致が判定されると思い込まない。
用語解説
- 可変
- 生成後にオブジェクトの内容を変更できる性質。
- 容量
- 再確保せずに保持できる文字数の目安となる内部領域。現在の長さとは別。
- メソッド連鎖
- 戻り値を次のメソッドの呼出し先として使う記法。
関連教材
参考資料
教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。
- https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/String.html
- https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/StringBuilder.html
- https://docs.oracle.com/javase/specs/jls/se17/html/jls-3.html#jls-3.10.5
- https://docs.oracle.com/javase/specs/jls/se17/html/jls-15.html#jls-15.21.3
確認問題の出題・採点や学習履歴の保存にはログインが必要です。