StringBuilder クラス (livedocs@lab) は String と同じように文字列を扱うクラスですが、特に文字列に追加や挿入などの操作を何回も行うような場合に使います。String と違い、操作の度に新しいオブジェクトを生成したりしないため、メモリをより有効に使用することができます。特に、細かな追加を何回も行う場合には String と比べて高速です。
StringBuilder のインスタンスを生成するにはコンストラクタを使用します。String のように直接文字列で初期化することはできません。
var sb:StringBuilder = new StringBuilder("hello world");
capacity 属性と length 属性
StringBuilder はインスタンス生成時に、文字列を保持するための領域をメモリ上に確保します。 領域の大きさは capacity 属性(読み取り専用)から取得することができます。文字列自体の長さは length 属性から取得できます。
var sb:StringBuilder = new StringBuilder("hello world"); trace(sb.length); // 11 が出力される trace(sb.capacity); // 16 が出力される
上記のように StringBuffer は legth 以上の大きさになるようなあるまとまった単位でメモリを確保します。このため余っている領域で足りる程度の追加/挿入であればメモリを確保しなくてもよいのです。
余談(?)ですが、length は設定可能です。length を小さくすると文字列の長さも短くなります。一旦短くなった文字列は length のみ大きくしても元には戻りません。
var sb1:StringBuilder = new StringBuilder("hello world"); sb1.length = 3; trace(sb1); // hel が出力される sb1.length = 110; trace(sb1); // hel が出力される trace(sb1.capacity); // 142 が出力される
length に応じて capacity は大きくなりますが capacity を確保することが目的であれば専用のメソッド(後述)を使用するほうがよいでしょう。
append() メソッド、 insert() メソッド、 remove() メソッド
最初の例に続けて、少し文字列を付け足して見ます。追加するには append() メソッドを使用します。
sb.append(" wide web"); trace(sb); // hello world wide web が出力される trace(sb.length); // 20 が出力される trace(sb.capacity); // 34 が出力される
文字列が確保されていた領域より長くなったため capacity が大きくなっています。大体倍になっていますね。
append() は複数の引数を取ることができます。2つ以上指定した場合は、引数の順に追加されます。
文字列の途中に文字列を挿入するには insert() メソッドを使用します。第一引数が挿入位置のインデックス、第二引数が挿入する文字列です。
上の例に続けて文字列を挿入してみます。
sb.insert(5, " beautiful"); trace(sb); // hello beautiful world wide web が出力される trace(sb.length); // 30 が出力される trace(sb.capacity); // 34 が出力される
今回は capacity は追加することなく処理ができました。
remove() メソッドを使うと文字列の一部削除ができます。第一引数が削除開始するインデックス、第二引数が削除終了位置の次のインデックスです。
sb.remove(0, 6); trace(sb); // beautiful world wide web が出力される trace(sb.length); // 24 が出力される trace(sb.capacity); // 34 が出力される
ensureCapacity() メソッドと trimToSize() メソッド
StringBuilder のインスタンスの持つ capacity を明示的に確保したい場合は ensureCapacity() メソッドを使います。事前に必要となる大きさが分かっている場合は、ちょっとずつ増やすよりは効率がよさそうです。
var sb2:StringBuilder = new StringBuilder(); sb2.ensureCapacity(1000); trace(sb2.length); // 0 が出力される trace(sb2.capacity); // 1000 が出力される
逆に不要な領域を開放するには trimToSize() メソッドを使います。上の例の続きです。
sb2.append("what a wonderful world"); trace(sb2.length); // 22 が出力される trace(sb2.capacity); // 1000 が出力される sb2.trimToSize(); trace(sb2.length); // 22 が出力される trace(sb2.capacity); // 22 が出力される
capacity が文字列の長さまで小さくなっているのが分かります。(16 よりは小さくならないようです)
僕はAdobeのAS3(flah9)を使っています。StringBuilderクラスを使用したいですが、flash.utilというパッケージは見つかりませんでした。
代わりにflash.utilsというパッケージを発見しましたが、その中にStringBuilderはありませn。。。
これはなぜですか、SDKに関係がありますか。教えていただきないでしょうか。
申し訳ありません。StringBuilder クラスは記事を書いた時点では存在しましたが AS3 が正式バージョンになる時点で削除され無くなりました。また、パッケージ名の flash.util から flash.utils への変更も記事の公開以降に行われています。
もともと、この blog 自体がベータ期間中に日本語でも情報を提供することを目的としていたため、製品版とは異なる箇所が存在します。本来は修正すべき内容ですが、なかなか手がつけられず余計なお手間を取らせてしまいました。どうかご容赦ください。
ご指摘いただいてありがとうございました。