JavaのStringBuilderとStringBufferの違い

StringBuilderとStringBufferの違いを言えるか

という話。
どっちでもいいんじゃん?というのが大多数の正直な意見かもしれないがどうせ使うならいい方を使いたい。

ということで調査、アンドメモ。

違い

StringBuilderはJava5で導入された。
それ以前から使われていたのがStringBuffer。

二つの違いは排他制御があるかどうか。
Java8のStringBuilderドキュメントでは、

文字の可変シーケンスです。このクラスは、StringBufferと互換性があるAPIを提供しますが、同期化は保証されません。このクラスは、文字列バッファが単一のスレッド(一般的なケース)により使用されていた場合のStringBufferの簡単な代替として使用されるよう設計されています。このクラスは、ほとんどの実装で高速に実行されるので、可能な場合は、StringBufferよりも優先して使用することをお薦めします。

と書いてある。

StringBufferを使用すればメソッドが呼ばれる度にStringbufferオブジェクトがロックされます。
つまり排他制御が行われるわけですが、それと同時に速度も犠牲にしている。
もっというとほとんどのケースの場合、スレッドセーフである必要がないためStringBuilderの方が速いし基本はこっちを使っておけば良い、という話。

ちなみに逆にStringBufferの方が明確に良いケースってあるんですかね。
パッと思いつかないのでどこかで考えてそれでパターン分けしていれば困ることは無くなりそう。

備考

StringBuilderの構造はこんな感じ。




コメント

このブログの人気の投稿

Braveブラウザの同期機能をiPhoneで設定した話。

failed: unable to get local issuer certificate (_ssl.c:1123)と出たので解決した話

自作のChrome Extensionをインポートした時に "Invalid value for 'content_scripts[0].matches[0]': Empty path."というエラーが出たので解決した