可変文字列
可変文字列クラス(StringBuilder)
class StrBld01
{
public static void main(String[] args)
{
StringBuilder sb = new StringBuilder(); // コンストラクタ
sb.append("ABC"); // 文字列の追加
sb.append(3.14); // 数値を文字列として追加
System.out.println(sb.toString()); // ABC3.14
sb.insert(3, "南北"); // 挿入(3文字目から)
System.out.println(sb.toString()); // ABC南北3.14
sb.delete(5, 7); // 削除(5〜6文字を削除)
System.out.println(sb.toString()); // ABC南北14
sb.replace(3, 5, "上下左右"); // 置換(3〜4文字を置き換える)
System.out.println(sb.toString()); // ABC上下左右14
System.out.println(sb.length()); // 9
sb.setLength(5); // 文字数の設定
System.out.println(sb.toString()); // ABC上下
sb = new StringBuilder("XYZ東西"); // コンストラクタに初期値を指定
System.out.println(sb.toString());
}
}
StringBuilderクラスは、文字列を格納し、更に文字列の追加や削除のような変更ができます。
Stringクラスでは生成時の文字列から変更はできません。「文字列 + 文字列」のような文字列の連結は、連結後の文字列のStringオブジェクトを新たに生成しなおしているので、見た目よりも実際は多くの処理がかかっています。頻繁な文字列加工はStringBuilderクラスを利用する方が効率的です。
StringBuilderクラスは、文字列の追加・挿入・削除・置換の各種編集メソッドが用意されています。
append(文字列)
|
末尾に追加
|
insert(位置, 文字列)
|
先頭を0とした位置から開始するように挿入
|
delete(開始, 終了)
|
開始から終了の手前までを削除
|
replace(開始, 終了, 文字列)
|
開始から終了の手前までの部分文字列を文字列に置き換える
|
削除と置換の開始と終了の範囲の中に、終了に指定した位置の文字は含まないことに注意が必要です。
文字列の長さはlength()メソッドで取得します。setLength()メソッドは文字数を変更します。
length()
|
文字数を返す
|
setLength(文字数)
|
文字数を変更する
|
setLength()メソッドで指定する文字数が格納されている文字列より短い場合は、指定文字数以降の文字列は削除されます。逆に現在の文字列より長く指定した場合は、末尾の不足分はnull文字(\u0000)で埋められます。setLength()メソッドは、決して固定バッファのように格納文字数の上限を設定するものではありません。
マルチスレッド対策可変文字列クラス(StringBuffer)
class StrBld02
{
public static void main(String[] args)
{
StringBuffer sb = new StringBuffer(); // コンストラクタ
sb.append("ABC"); // 文字列の追加
sb.append(3.14); // 数値を文字列として追加
System.out.println(sb.toString()); // ABC3.14
sb.insert(3, "南北"); // 挿入(3文字目から)
System.out.println(sb.toString()); // ABC南北3.14
sb.delete(5, 7); // 削除(5〜6文字を削除)
System.out.println(sb.toString()); // ABC南北14
sb.replace(3, 5, "上下左右"); // 置換(3〜4文字を置き換える)
System.out.println(sb.toString()); // ABC上下左右14
}
}
StringBufferクラスはStringBuilderクラスと機能が全く同じな互換クラスです。StringBufferクラスがStringBuilderクラスと異なるのは、マルチスレッドに対応していることです(スレッドセーフ)。StringBufferクラスの方がスレッドの考慮が不要で安全に使用できますが、内部処理が複雑になるため簡素なStringBuilderクラスよりも動作が遅くなります。