【Java入門 実用編】StringBuilder クラスの利用(1)
2025.08.29
以前の「Java入門 実用編」の記事(文字列の基本的な操作(1)/文字列の基本的な操作(2))では、文字列の結合などで StringBuilder クラスを利用する方法について少し触れました。当記事では StringBuilder を利用して行うことができる、代表的な文字列の操作についてご紹介します。
StringBuilder クラスのインポートと利用
インポート
StringBuilder クラスは java の基本パッケージ(java.lang)のクラスであるため、使用時に import 宣言を行う必要はありません。
インスタンスの生成とコンストラクタ
StringBuilder クラスは文字の可変シーケンス(文字を特定の順序で並べたもの)として動作するクラスです。(以下、当記事で単に「シーケンス」と述べた場合はこの「文字の可変シーケンス」を指します)
StringBuilder クラスの利用時はインスタンスを生成する必要があります。コンストラクタは以下の4種類が準備されています。
コンストラクタ | 内容 | 初期容量 |
StringBuilder() | 空の(文字を持たない)インスタンスを生成 | 16 |
StringBuilder( int capacity ) | 引数で指定した容量で空のインスタンスを生成 | 引数で指定した値 |
StringBuilder( CharSequence seq ) | 引数で指定した CharSequence の文字をシーケンスに持つインスタンスを生成 | 引数に渡した CharSequenceの 長さ+16 |
StringBuilder( String str ) | 引数で指定した文字列をシーケンスに持つインスタンスを生成 | 引数に渡した 文字列の長さ+16 |
シーケンスは、実際にはインスタンス内部に char の配列として保持しており、その中に文字列の各文字を格納することで制御されています。StringBuilderクラスでは、コンストラクタの実行時にシーケンスの容量(配列の長さ)が決定されます。
容量の自動拡張
文字列の結合などでシーケンスの容量が不足する場合、容量は自動的に拡張されます。拡張された後の容量は通常は拡張前のサイズの「2倍+2」となりますが、一度に長い文字列を結合するなどしてこのサイズに収まらない場合は、結合後の文字列のサイズに拡張されます。
容量の理論上の最大値は Integer の最大値(2,147,483,647)ですが、StringBuilder 内のデータは Java のヒープ領域に格納されるため、実際には上限に達する前に OutOfMemoryError が発生することが予想されます。
文字列の編集
StringBuilder インスタンスは、文字列の結合、挿入、削除といった一般的な文字列の編集や、繰り返し、前後の逆転といった編集を行うことができます。
これらのメソッドは、戻り値がメソッドを呼び出した StringBuilder インスタンスそのものであるため、戻り値に対して編集のメソッドを繰り返し実行することができる点が StringBuilde クラスの特徴と言えます。
append メソッド(文字列の結合)
以前の記事(文字列の基本的な操作(1))でもご紹介したとおり、append メソッドを利用して文字列を結合することが可能です。
append メソッド - Java 21 APIドキュメント
append メソッドは文字列(String)以外にも boolean や int といったプリミティブ型、StringBuiler をはじめとする CharSequence インターフェイスの実装クラス、その他のオブジェクト型を引数としたオーバーロードメソッドが多数用意されているため、多くのケースで型の変換を意識せずに結合することができます。
StringBuilder sb = new StringBuilder();
Object nullObj = null;
sb.append(true) // boolean
.append('x') // char
.append(new char[] {'y','z'}) // char[]
.append(0) // int
.append(1L) // long
.append(2.3f) // float
.append(4.5d) // double
.append("String"); // String/CharSequence
// 上記全てを連結した文字列(truexyz012.34.5String)を出力
System.out.println(sb.toString());
append メソッドでは、String や CharSequence 、char の配列といった文字列の内容を持つものを連結した場合はその文字列が結合され、その他のオブジェクト型やプリミティブ型を連結した場合は String.valueOf メソッドで返される文字列が追加されます。
ただし、引数に渡したオブジェクト型の変数が null であった場合は、String クラスでの結合時と同様に「null」という文字列リテラルが結合されることに注意が必要です。
StringBuilder sb = new StringBuilder();
Object nullObj = null;
sb.append("NULL:")
.append(nullObj); // Object(null)
// 「NULL:null」と出力される
System.out.println(sb.toString());
insert メソッド(文字列の挿入)
insert メソッドでは、シーケンスの任意の位置に文字列を挿入することができます。
insert メソッド - Java 21 APIドキュメント
insert メソッドでは引数で挿入する位置(インデックス)と、挿入する値を指定します。(長さと同じ値を指定した場合は、文字列の末尾に結合されます)
挿入する値は、append メソッド同様に文字列やプリミティブ型など多くのオーバーロードメソッドが準備されており、オブジェクト型やプリミティブ型を指定した場合に挿入される文字列も append メソッドと同様です。
StringBuilder sb = new StringBuilder("ABCDE");
// index:3 の位置に"xyz"を挿入
sb.insert(3, "xyz");
// 「ABCxyzDE」と出力される
System.out.println(sb.toString());
delete メソッド(文字列の部分削除)
delete メソッドは、シーケンス内の指定した範囲の文字列を削除します。シーケンスの削除された部分は後続の文字により詰められます。
delete メソッド - Java 21 APIドキュメント
delete メソッドでは削除する範囲を、削除を開始する位置(インデックス)と終了する位置で指定します。削除されるのは開始位置以降かつ終了位置より前の範囲の文字列です。
終了位置がシーケンスの長さを超えている場合は開始位置から末尾までの文字列が削除され、例外は発生しません。また、開始位置が現在のシーケンスの長さと等しい場合や、開始位置と終了位置が同じ値の場合は、シーケンスは変更されません。
StringBuilder sb1 = new StringBuilder("ABCDE");
StringBuilder sb2 = new StringBuilder("ABCDE");
StringBuilder sb3 = new StringBuilder("ABCDE");
// 指定した範囲の文字を削除
sb1.delete(2, 4); // "ABE" となる
// 終了位置がシーケンスの長さよりも大きい場合は末尾まで削除
sb2.delete(2, 8); // "AB" となる
// 以下の場合は変更されない("ABCDE"のまま)
sb3.delete(5, 7); // 開始位置がシーケンスの長さと同じ
sb3.delete(3, 3); // 開始位置と終了位置が同じ
ただし、以下に示す開始位置と終了位置による範囲指定が不正なケースでは StringIndexOutOfBoundsException が発生します。
・開始位置が負の値、または現在のシーケンスの長さを超えている場合
・終了位置の値が、開始位置の値よりも小さい場合
StringBuilder sb = new StringBuilder("ABCDE");
/* 以下の場合は例外が発生 */
// 開始位置が負の値
sb.delete(-1, 2);
// 開始位置がシーケンスの長さよりも大きい
sb.delete(7, 10);
// 終了位置が開始位置より小さい
sb.delete(3, 2);
deleteCharAt メソッド(指定位置の文字を削除)
deleteCharAt メソッドは、StringBuilder インスタンスから指定した位置の1文字を削除します。
deleteCharAt メソッド - Java 21 APIドキュメント
StringBuilder sb = new StringBuilder("ABCDE");
// インデックス:2 の位置の文字(C)を削除
sb.deleteCharAt(2);
// 「ABDE」と出力される
System.out.println(sb.toString());
repeat メソッド(文字列の繰り返し)
repeat メソッドは、StringBuilder インスタンスに対し引数で指定した文字または文字列を、引数で指定した回数だけ繰り返し末尾に結合します。
repeat メソッド - Java 21 APIドキュメント
繰り返し結合させる文字列は String クラスをはじめとする CharSequence インターフェイスの実装クラス、もしくは 文字のコードポイント(char 型も可)で指定できます。繰り返し回数は 0 以上の値である必要があります。(負の値を指定した場合は IllegalArgumentException が発生します)
StringBuilder sb1 = new StringBuilder("ABCDE");
StringBuilder sb2 = new StringBuilder("ABCDE");
StringBuilder sb3 = new StringBuilder("ABCDE");
StringBuilder sb4 = new StringBuilder("ABCDE");
// 「XYZ」を3回末尾に結合
sb1.repeat("XYZ", 3); // "ABCDEXYZXYZXYZ"
// 「*」(char)を10回末尾に結合
sb2.repeat('*', 10); // "ABCDE**********"
// 「*」のコードポイント 0x002A(=42)を指定しても同様
sb3.repeat(0x002A, 10); // "ABCDE**********"
sb4.repeat(42, 10); // "ABCDE**********"
setLength メソッド(文字列長の設定)
setLength メソッドは、シーケンスを指定した長さに設定します。
setLength メソッド - Java 21 APIドキュメント
setLength メソッドでは、指定した長さの最後の文字よりも後ろの文字は全て削除されます。指定した長さが現在のシーケンスの長さ以上の場合は、シーケンスには変更はありません。
また、シーケンス内の文字数が削減される場合でも、StringBuilder インスタンスの容量には変化がないことに注意してください。容量を圧縮したい場合は、setLength メソッドの実行後に trimToSize メソッドを実行する必要があります。
StringBuilder sb = new StringBuilder("ABCDE");
// シーケンスの長さを3に設定 -> 4文字目以降は削除
sb.setLength(3);
// 「ABC」と出力される
System.out.println(sb.toString());
replace メソッド(文字列の置き換え)
replace メソッドは、シーケンス内の指定した範囲の文字群を、指定した文字列の文字に差し替えます。範囲は開始位置と終了位置をインデックスで指定します。
replace メソッド - Java 21 APIドキュメント
StringBuilder sb = new StringBuilder("ABCDE");
// インデックス:1 から 4の前までの文字を置き換え
sb.replace(1, 4, "xyz");
// 「AxyzE」と出力される
System.out.println(sb.toString());
replace メソッドでは、差し替える範囲の長さと、置き換える文字列の長さは同一である必要はありません。動作結果としては、シーケンスから指定した範囲の文字を削除し、その位置に指定した文字列を差し込んだ結果と同じ内容になります。
StringBuilder sb1 = new StringBuilder("ABCDE");
StringBuilder sb2 = new StringBuilder("ABCDE");
StringBuilder sb3 = new StringBuilder("ABCDE");
// 1文字だけの範囲を3文字に差し替え
sb1.replace(2, 3, "xyz"); // "ABxyzDE"
// 開始位置と終了位置が同じ(=指定範囲の長さがゼロの)場合はinsert同様の動作
sb2.replace(3, 3, "xyz"); // "ABCxyzDE"
// 終了位置が文字の長さより大きい場合は末尾までの範囲を差し替え
sb3.replace(4, 6, "xyz"); // "ABCDxyz"
delete メソッド同様に、開始位置が負の値または現在のシーケンスの長さを超えている場合や、終了位置の値が開始位置の値よりも小さい場合は StringIndexOutOfBoundsException が発生します。
setCharAt メソッド(文字の置き換え)
setCharAt メソッドは、シーケンス内の指定した位置の文字を1つ、指定した文字に置き換えます。
setCharAt メソッド - Java 21 APIドキュメント
repeat メソッドと異なり、置き換える文字として指定する値は char 型である必要があります。コードポイントで置き換えたい場合は、char 型にキャストする必要があります。
StringBuilder sb1 = new StringBuilder("ABCDE");
StringBuilder sb2 = new StringBuilder("ABCDE");
StringBuilder sb3 = new StringBuilder("ABCDE");
// インデックス:2 の位置の文字を「*」に置き換え
sb1.setCharAt(2, '*'); // "AB*DE"
// コードポイントを利用したい場合は char 型にキャストが必要
sb2.setCharAt(2, (char) 0x002A); // "AB*DE"
sb3.setCharAt(2, (char) 42); // "AB*DE"
reverse メソッド(文字列の反転)
reverse メソッドは、シーケンスの順序(文字の並び順)を反転させます。
reverse メソッド - Java 21 APIドキュメント
StringBuilder sb = new StringBuilder("ABCDE");
// 文字列を反転
sb.reverse();
// 「EDCBA」と出力される
System.out.println(sb.toString());
文字列の切り出し・取得
StringBuilder インスタンスからは、文字や部分的な文字列、char配列などを取得することができます。これらのメソッドでは戻り値が StringBuilder 以外の型になります。
charAt メソッド(指定位置の文字を取得)
charAt メソッドは、シーケンス内の指定した位置(インデックス)の文字(char)を取得します。
charAt メソッド - Java 21 APIドキュメント
StringBuilder sb = new StringBuilder("ABCDE");
// 戻り値の型は char
char ch = sb.charAt(2);
// 「C」が出力される
System.out.println(ch);
getChars メソッド(部分的な文字配列の切り出し)
getChars メソッドは、シーケンス内の指定した範囲の文字を切り出して、引数に渡した char の配列にコピーします。範囲は開始位置と終了位置を指定します。また、コピー先の char 配列および、その配列の何番目からに対してコピーをするか(先頭の場合は 0)を指定する必要があります。
getChars メソッド - Java 21 APIドキュメント
StringBuilder sb = new StringBuilder("ABCDE");
// 切り出したシーケンスを格納する配列
char[] child = new char[3];
// sb のインデックス1から4の前までの文字を child にコピー
sb.getChars(1, 4, child, 0);
// 「BCD」が出力される
System.out.println(child);
開始位置が負の値または現在のシーケンスの長さを超えている場合や、終了位置の値が開始位置の値よりも小さい場合は StringIndexOutOfBoundsException が発生します。また、delete メソッドや replace メソッドとは異なり、切り出し範囲の終了位置がシーケンスの長さよりも大きい場合も例外が発生します。
substring メソッド(一部分を文字列として取得)
substring メソッドは、シーケンス内の指定した範囲を、文字列として取得します。
substring メソッド - Java 21 APIドキュメント
StringBuilder sb = new StringBuilder("ABCDE");
// 戻り値の型は String クラス
String subStr = sb.substring(1,4);
// 「BCD」が出力される
System.out.println(subStr);
subSequence メソッド(子シーケンスの取得)
subSequence メソッドは、シーケンス内の指定した範囲を新たなシーケンス(CharSequence)として取得します。
subSequence メソッド - Java 21 APIドキュメント
StringBuilder sb = new StringBuilder("ABCDE");
// 戻り値の型は CharSequence インターフェイス
CharSequence subSeq = sb.substring(1,4);
// 「BCD」が出力される
System.out.println(subSeq);
ただし一般的な Java の実装では、メソッドの戻り値として CharSequence インターフェイスの実装クラスである String クラスのインスタンスが返却されるため、通常は substring メソッドを利用することで問題ないでしょう。
toString メソッド(文字列化)
StringBuilder のシーケンス全体を文字列(String インスタンス)に変換するには、toString メソッドを利用します。
toString メソッド - Java 21 APIドキュメント
toString メソッドは Object クラスのオーバーライドメソッドとして実装されており、StringBuilder クラスではシーケンスを文字列化して返します。
StringBuilder sb = new StringBuilder("ABCDE");
// 文字列「ABCDE」を取得
String str = sb.toString();
次回の記事では、StringBuilder クラスの比較や情報の取得といったメソッドとあわせ、メソッドを組み合わせて使うなどさらに実践的な利用方法をご紹介します。