|
|
クラスライブラリの利用 (StringBuilder クラス) |
H.Kamifuji . |
可変長の文字列を扱うためのStringBuilderクラスについて見ていきます。(単一スレッドで使うことを前提としたStringBufferクラスの代わりのクラスとなっており、StringBufferクラスより高速ということです)。 Stringクラスとの違いは、Stringクラスは本来固定の文字列となっており一度作成すると変更は出来ません。「+」演算子を使って文字列の連結を行う場合には、内部的にStringBuilderクラス(又はStringBufferクラス)を使って行われています。このように文字列連結を行う時にはいったんStringBuilderクラスに内部で変換が行われて処理されるため、文字列の連結が多数行われる場合には最初からStringBuilderクラスを使ったほうが高速に行われます。 クラス定義は下記のようになっています。 java.lang.Object | +-- java.lang.StringBuilder public final class StringBuilder extends Object implements Serializable, CharSequenceStringBuilderクラスはjava.langパッケージに含まれますのでimport文は必要ありません。 当ページでは、Linux CentOS7 の Gnome で動作テストしています。 現在(2021/08)では、JDK-16.0.2 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2021/11)では、JDK-17.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2023/04)では、JDK-20.0.1 にアップされています。一部、上位互換について、見直しを行っていきます。 現在(2024/10)では、JDK-23 にアップされています。一部、上位互換について、見直しを行っていきます。 |
|
まずStringBuilderクラスの使い方から見ておきます。Stringクラスを使って文字列を連結するというのは例えば下記のようなことです。 String str = "abc" + "def" + "ghi";Stringクラスのオブジェクトである文字列は、「+」演算子を使って文字列と文字列をつなげることが出来ます。上記の場合であれば「abc」という文字列に「def」という文字列を最後に追加した新しい文字列を作成します。さらにその新しい文字列の最後に「ghi」とい文字列を追加して新しい文字列を作成しています。 これはStringクラスが本来固定長であるためで、一度作成した文字列に後から文字を追加することが出来ないため、2つの文字列を結合した値を持つ新しい文字列を作成しているわけです。これに対してStringBuilderクラスは可変長の文字列を扱うクラスで、新しくオブジェクトを作成することなく随時文字列を追加することが出来ます。 その為、文字列を連結する処理が多い場合には、最初からStringBuilderクラスで文字列の連結を行っておき、最後にStringBuilderクラスのオブジェクトからStringクラスのオブジェクトを作成することで効率よく文字列の連結が行えます。 ここではまず作成したStringBuilderクラスのオブジェクトに文字列を追加するためのメソッドを確認します。 append public StringBuilder append(String str)指定された文字列をこの文字シーケンスに追加します。 String 引数の文字が、順番にこのシーケンスに追加されます。その結果、引数の長さの分だけこのシーケンスの長さが増えます。str が null の場合、"null"の 4 文字が追加されます。 パラメータ: str - 文字列 戻り値: このオブジェクトへの参照 現在StringBuilderクラスのオブジェクトに格納されている文字列の最後に引数で指定した文字を追加します。StringBuilderクラスのオブジェクトの作成から文字列の追加、そして最後にStringクラスの作成までの一連の流れは下記のようになります。 StringBuilder sb = new StringBuilder(); sb.append("abc"); sb.append("def"); sb.append("ghi"); Strint str = new String(sb); // "abcdefghi"上記のappendメソッドの引数はString型となっていますが、同じメソッドで引数の型が違うメソッドが用意されています。 StringBuilder append(boolean b) StringBuilder append(char c) StringBuilder append(char[] str) StringBuilder append(char[] str, int offset, int len) StringBuilder append(CharSequence s) StringBuilder append(CharSequence s, int start, int end) StringBuilder append(double d) StringBuilder append(float f) StringBuilder append(int i) StringBuilder append(long lng) StringBuilder append(Object obj) StringBuilder append(StringBuffer sb)String型以外の値の場合は、いったん文字列表現の形に変更されてから追加されて行きます。ほとんどの型について用意されていますので、あまり型を気にすることなく値を追加していく事が出来ます。(文字列の「+」の連結で文字列と数字の連結なども出来るのはこのためです)。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testStringBuilder1{ public static void main(String args[]){ dispHantei("山田", 89); dispHantei("鈴木", 45); dispHantei("伊藤", 67); dispHantei("加藤", 92); } private static void dispHantei(String name, int tokuten){ StringBuilder sb = new StringBuilder(); sb.append(name); sb.append("さんの成績は"); sb.append(tokuten); sb.append("点です。結果は"); if (tokuten > 75){ sb.append("合格"); }else{ sb.append("不合格"); } sb.append("です。"); System.out.println(new String(sb)); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd StringBuilder]$ javac testStringBuilder1.java [xxxxxxxx@dddddddddd StringBuilder]$ java testStringBuilder1 山田さんの成績は89点です。結果は合格です。 鈴木さんの成績は45点です。結果は不合格です。 伊藤さんの成績は67点です。結果は不合格です。 加藤さんの成績は92点です。結果は合格です。 [xxxxxxxx@dddddddddd StringBuilder]$ |
指定した位置に文字列を挿入するメソッドを確認します。 insert public StringBuilder insert(int offset, String str)文字列をこの文字シーケンスに挿入します。 String 引数の文字が、このシーケンスの指定されたオフセット位置に順番に挿入されます。その位置にあった文字は移動され、引数の長さの分だけこのシーケンスの長さが増加します。str が null の場合は、"null" の 4 文字がこのシーケンスに挿入されます。 offset 引数は 0 以上で、このシーケンスの長さに等しいかこれより小さくなければなりません。 パラメータ: offset - オフセット str - 文字列 戻り値: このオブジェクトへの参照 例外: StringIndexOutOfBoundsException - オフセットが無効な場合 appendメソッドは最後に文字列を追加しましたが、insertメソッドは指定した位置に文字列を挿入します。挿入する位置を表すオフセットは先頭が0となります。またバイト数ではなく文字数での位置となりますので半角文字も全角文字も同じ扱いとなります。 上記のinsertメソッドの引数はString型となっていますが、同じメソッドで引数の型が違うメソッドが用意されています。 StringBuilder insert(int offset, boolean b) StringBuilder insert(int offset, char c) StringBuilder insert(int offset, char[] str) StringBuilder insert(int index, char[] str, int offset, int len) StringBuilder insert(int dstOffset, CharSequence s) StringBuilder insert(int dstOffset, CharSequence s, int start, int end) StringBuilder insert(int offset, double d) StringBuilder insert(int offset, float f) StringBuilder insert(int offset, int i) StringBuilder insert(int offset, long l) StringBuilder insert(int offset, Object obj)appendメソッドと同じくString型以外の値の場合は、いったん文字列表現の形に変更されてから挿入されて行きます。 では実際に試してみましょう。 サンプルプログラム下記のサンプルを実行してみよう。class testStringBuilder2{ public static void main(String args[]){ StringBuilder sb = new StringBuilder(); sb.append("こんにちは。元気です。"); sb.insert(5, "鈴木さん"); System.out.println(new String(sb)); } }上記をコンパイルした後で実行すると次のように表示されます。 [xxxxxxxx@dddddddddd StringBuilder]$ javac testStringBuilder2.java [xxxxxxxx@dddddddddd StringBuilder]$ java testStringBuilder2 こんにちは鈴木さん。元気です。 [xxxxxxxx@dddddddddd StringBuilder]$ |
|