Javaの文字列結合クラス、StringBuilderやStringBufferのコンストラクタ引数”初期容量”って何?初期容量の決め方。
Javaの文字列結合操作を行う時に使う、StringBuilderやStringBuffer、コンストラクタに数値を渡してサイズを決められるのは知っていましたが・・・。この引数の意味、曖昧だったので整理してみました。
目次
Javaで文字列結合するなら StringBuilder
Javaで文字列を結合するには、”ABC” + “def” + “GHI” よりも、new StringBuilder().append(“ABC”).append(“def”).append(“GHI”) を推奨。理由は無駄に文字列インスタンスを生成しないから効率的というのはよく聞く話です。
StringBuilderとStringBufferの違いは、StringBuilderは複数スレッドで同時にアクセスできないけどStringBufferより高速(より効率がいい)、複数スレッドからアクセスされる可能性があるならStringBufferという選択肢になります。
さて本題です。
コンストラクター引数の初期容量(capacity)とは?
StringBuilderも、StringBufferも、コンストラクターの引数(capacity)に1以上の正数を渡すことができます。
StringBuilder (Java Platform SE 7 )
参考にしたページです。
JavaDocによるとこのコンストラクターは、次のように解説されています。
文字を持たず、capacity 引数によって指定された初期容量の文字列ビルダーを構築します。
ちなみに何も指定しない場合の初期容量は16とのこと。初期容量をオーバーしても自動で容量が増やされるので致命的なエラーに繋がることはないのですが、容量確保の処理が発生してしまいます。
せっかく処理効率を意識してStringBuilderやStringBufferを使用しているのですから、初期容量を適切に指定して使うのがベストというわけです。
初期容量とは「何文字まで文字列を格納できるか?」ということ
さて、この初期容量っていったい何なの?というのが今回の話題です。ここまで解説しておきながら根本的な問題です。
私は安易に.appendできる回数かと思ってました。 ← ×
正解は「何文字までの文字列を格納できるか」です。こんな思い違い私だけでしょうか・・
「StringBuffer(文字列バッファ)の容量」と言い直せばしっくりきますね。文字列バッファの容量ときたら文字サイズです。何文字まで文字列を積めていけるかがStringBufferの容量です。後から登場したStringBuilderはイメージが沸きにくい名前ですが、全く同じです。
初期容量の次はいくつになるのか?
ところでこのStringBuilder、初期容量を超えると次はどんな容量に決まるのか試してみました。
new StringBuilder() と、デフォルトコンストラクターでインスタンス生成した場合は、初期の16文字を超えると、次は34文字、その次は70文字でした。
new StringBuilder(30) と、コンストラクターに初期容量30文字を与えてインスタンス生成した場合は、初期の30文字を超えると、次は62文字でした。
中途半端な増え方に思えましたが、(直前の容量の2倍+2)文字が次の容量の様でした。
容量は少な過ぎても多過ぎても効率が悪くなってしまうので、これらを踏まえて初期容量を決めてやるのがStringBuilder、StringBufferの賢い使い方というわけですね。
勉強になりました。