java.langパッケージのStringBufferクラス

StringBufferコンストラクタ

コンストラクタ 説明
StringBuffer() デフォルトコンストラクタ。初期状態で16個の文字を保存できるオブジェクトを生成する。
StringBuffer(int capacity) 容量(capacity)で指定された文字数を保存できるオブジェクトを生成する。
StringBuffer(String str) strで指定された文字列に加えて、追加で16個の文字を保存できるオブジェクトを生成する。

StringBufferの主なメソッド

メソッド 説明
StringBuffer append(boolean b) bを現在の文字列の末尾に追加する。
StringBuffer append(char c) cを現在の文字列の末尾に追加する。
StringBuffer append(double d) dを現在の文字列の末尾に追加する。
StringBuffer append(float f) fを現在の文字列の末尾に追加する。
StringBuffer append(int i) iを現在の文字列の末尾に追加する。
StringBuffer append(long l) lを現在の文字列の末尾に追加する。
StringBuffer append(Object obj) objを現在の文字列の末尾に追加する。
StringBuffer append(String str) strを現在の文字列の末尾に追加する。
int capacity() 現在の文字列バッファの容量を返す。
char charAt(int index) indexに該当する文字を返す。
StringBuffer delete(int start, int end) startからendまでの範囲を削除する。
StringBuffer deleteCharAt(int index) indexの文字を削除する。
StringBuffer insert(int offset, boolean b) offset番目前にbを挿入する。
StringBuffer insert(int offset, char c) offset番目前にcを挿入する。
StringBuffer insert(int offset, int i) offset番目前にiを挿入する。
StringBuffer insert(int offset, long l) offset番目前にlを挿入する。
StringBuffer insert(int offset, Object obj) offset番目前にobjを挿入する。
StringBuffer insert(int offset, String str) offset番目前にstrを挿入する。
int length() 文字バッファにある文字数を返す。
StringBuffer replace(int start, int end, String str) startからendまでの範囲を文字列strで置換する。
StringBuffer reverse() 文字列を逆順にして返す。
void setCharAt(int index, char ch) indexの文字をchの値に設定する。
void setLength(int newLength) バッファのサイズをnewLengthに設定する。
String toString() 現在の文字列をStringオブジェクトとして返す。

文字列バッファのサイズ

  • int capacity()
  • int length()
  • void setLength(int newLength)

capacityメソッドは、StringBufferオブジェクトに割り当てられた総容量を取得するときに使用する。
lengthメソッドは、StringBufferオブジェクトの現在の長さを知るときに使用する。

package com.devkuma.tutorial.stringbuffer;

public class StringBufferCapacity {

    public static void main(String[] args) {

        StringBuffer sb = new StringBuffer("abcdef");

        System.out.println("capacity : " + sb.capacity());
        System.out.println("length : " + sb.length());

        sb.setLength(2);
        System.out.println("setLength : " + sb);
    }
}

実行結果:

capacity : 22
length : 6
setLength : ab

上の結果では、lengthメソッドは"abcdef"の長さである6を表示しているが、capacityメソッドは"abcdef"の長さ6に加えて16文字分の保存領域を自動で追加するため、容量22が表示されている。そしてsetLengthメソッドはバッファサイズを2に変更したため、“ab"が表示された。

文字列バッファの文字

StringBufferオブジェクトの文字(char)は、参照および置換が可能である。

  • char charAt(int index)
  • void setCharAt(int index, char ch)
package com.devkuma.tutorial.stringbuffer;

public class StringBufferChar {

    public static void main(String[] args) {

        StringBuffer sb = new StringBuffer("abcde");
        System.out.println("charAt(3) : " + sb.charAt(3));

        sb.setCharAt(4, 'f');
        System.out.println("setCharAt(4, 'f') : " + sb);
    }
}

実行結果:

charAt(3) : d
setCharAt(4, 'f') : abcdf

最初にcharAtを使って3番インデックスの値’d’を表示し、次にsetCharAtを使って4番インデックスの値を’f’に変更したため、最終的にabcdfが表示された。

文字列バッファへのデータ追加

StringBufferオブジェクトの末尾に、他のデータ型のデータを文字列に変換して追加するには、appendメソッドを使用する。

  • StringBuffer append(boolean b)
  • StringBuffer append(char c)
  • StringBuffer append(double d)
  • StringBuffer append(float f)
  • StringBuffer append(int i)
  • StringBuffer append(long l)
  • StringBuffer append(Object obj)
  • StringBuffer append(String str)

appendを使用した例は以下のとおりである。

package com.devkuma.tutorial.stringbuffer;

public class StringBufferAppend {

    public static void main(String[] args) {

        boolean b = true;
        char c = 'a';
        double d = 1.1;
        float f = 3.14f;
        int i = 1;
        long l = 2;
        String str = "A";

        StringBuffer sb = new StringBuffer();
        sb.append(b).append(", ");
        sb.append(c).append(", ");
        sb.append(d).append(", ");
        sb.append(f).append(", ");
        sb.append(i).append(", ");
        sb.append(l).append(", ");
        sb.append(str);

        System.out.println(sb);
    }
}

実行結果:

true, a, 1.1, 3.14, 1, 2, A

appendメソッドはStringクラスのconcatと似た用途のメソッドだが、Stringクラスとは異なり、新しいオブジェクトに新しい文字列が割り当てられるのではなく、呼び出した文字列に変更が保存される。与えられた文字列に他の文字列を追加する作業が多い場合は、StringBufferオブジェクトを使うことが性能向上に大きく役立つ。

次の例では、StringオブジェクトとStringBufferオブジェクトを生成した後、それぞれ文字列を10000回ずつ追加する。このとき各オブジェクトの速度を測定してみよう。測定には現在時刻を取得できるSystem.currentTimeMillis()メソッドを使用する。

package com.devkuma.tutorial.stringbuffer;

public class StringBufferAppend2 {

    public static void main(String[] args) {

        String str = "A";
        long currentStr = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            str += "A";
        }
        System.out.println("String :" + (System.currentTimeMillis() - currentStr) + "ms");

        StringBuffer sb = new StringBuffer("A");
        long currentSb = System.currentTimeMillis();
        for (int i = 0; i < 10000; i++) {
            sb.append("A");
        }
        System.out.println("StringBuffer :" + (System.currentTimeMillis() - currentSb) + "ms");

    }
}

実行結果:

String :68ms
StringBuffer :1ms

上の結果を見ると、StringオブジェクトよりStringBufferオブジェクトのほうが非常に速いことを確認できる。

文字列バッファへのデータ挿入

StringBufferオブジェクトの指定した位置に、他のデータ型のデータを文字列として挿入するには、insertメソッドを使用する。

  • StringBuffer insert(int offset, boolean b)
  • StringBuffer insert(int offset, char c)
  • StringBuffer insert(int offset, int i)
  • StringBuffer insert(int offset, long l)
  • StringBuffer insert(int offset, Object obj)
  • StringBuffer insert(int offset, String str)
package com.devkuma.tutorial.stringbuffer;

public class StringBufferInsert {

    public static void main(String[] args) {

        boolean b = true;
        char c = 'a';
        double d = 1.1;
        float f = 3.14f;
        int i = 1;
        long l = 2;
        String str = "A";

        StringBuffer sb = new StringBuffer("b=, c=, d=, f=, i=, l=, str=");
        sb.insert(2, b);
        sb.insert(10, c);
        sb.insert(15, d);
        sb.insert(22, f);
        sb.insert(30, i);
        sb.insert(35, l);
        sb.insert(42, str);

        System.out.println(sb);
    }
}

実行結果:

b=true, c=a, d=1.1, f=3.14, i=1, l=2, str=A

文字列バッファの文字列を逆順にする

StringBufferオブジェクトの文字列を逆順にして返す。

  • StringBuffer reverse()
package com.devkuma.tutorial.stringbuffer;

public class StringBufferReverse {

    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("abcdef");
        System.out.println(sb.reverse());
    }
}

実行結果:

fedcba

文字列バッファの文字列削除

StringBufferオブジェクトのdeleteメソッドは、指定された範囲を削除する。
StringBufferオブジェクトのdeleteCharAtメソッドは、入力したインデックスの文字を削除する。

  • StringBuffer delete(int start, int end)
  • StringBuffer deleteCharAt(int index)
package com.devkuma.tutorial.stringbuffer;

public class StringBufferDelete {

    public static void main(String[] args) {

        StringBuffer sb = new StringBuffer("abcxxxdef");
        sb.delete(4, 6);
        System.out.println(sb);
        sb.deleteCharAt(3);
        System.out.println(sb);
    }
}

実行結果は以下のとおりである。

abcxdef
abcdef

文字列バッファの文字列置換

StringBufferオブジェクトの文字列で、指定された範囲を入力された文字列に置換する。

  • StringBuffer replace(int start, int end, String str)
package com.devkuma.tutorial.stringbuffer;

public class StringReplace {

    public static void main(String[] args) {

        StringBuffer sb = new StringBuffer("abcxxghi");
        sb.replace(3, 5, "def");
        System.out.println(sb);
    }
}

実行結果は以下のとおりである。

abcdefghi