String
→定数のような変わらない値に使用する。
String a = "moji1" を宣言し
a = a + "moji2" と書くと "moji1"を破棄して "moji1moji2" という文字列を作る。
(連結と言うよりは新しく作り直す)
結果としてシステム内が文字列のコピーだらけになってしまい。メモリ確保に
ガーベッジコレクタを起動させるのでパフォーマンスを低下させる要因になる。
StringBuffer
→可変な値(後から文字が増える可能性があるもの)に使用する。
書き換えによって今まで確保していた以上のメモリが必要になった場合は、
“今まで確保していたメモリの倍”メモリを確保する。
(元々確保していたメモリが10だった所に、11入れようとすると
メモリを20確保して入れる。)
StringBuilder
→考え方はStringBufferと同じ。
StringBufferとStringBuilderの違い
StringBufferのメソッドはsynchronizedになっていて、
StringBuilderのメソッドはsynchronizedになっていない。
StringBufferは複数のスレッドから使用される場合でも安全だが、
synchronized(=同期化)にはコストがかかるため、処理が遅くなる。
StringBufferのスレッドセーフを無くしたもの = StringBuffer
(単一スレッドで使うことを前提としたStringBufferクラスの代わりのクラスとなっており、
StringBufferクラスより高速)
※Stringクラスは本来固定長であるため
一度作成した文字列に後から文字を追加することが出来ない、
2つの文字列を結合した値を持つ新しい文字列を作成している。
これに対してStringBuilder・StringBufferクラスは可変長の文字列を扱うクラスで、
新しくオブジェクトを作成することなく随時文字列を追加することが出来る。
実際の速度の違いについて
何百回も文字連結するのでなければさほどの差は無いみたい。
ループ外でも回数が多ければ StringBuilder。
ループ外で、かつ一桁程度の回数しか連結しないんだったら += でもいい。
らしい
0 件のコメント:
コメントを投稿