StringBufferとStringBuilderの浅い分析

1422 ワード

1.なぜStringBufferとStringBuilderを使うのですか?
 
String c="aaa"+"bbb"とsb.append("aaa").append(「bbb」)にはどのような違いがあるのか、このような質問はよく知られているはずですが、面接問題によく登場します.答えはよく知られていると思います.+で複数のStringを作成します.Stringは定数プールに保管されているので、変えてはいけません.「aaa」は「aaabbb」にはなりません.逆に聞くと、StringBufferやStringBuilderはどうやって実現したのか考えたことがあります.StringBufferの下位データ構造はどうなっていますか?この質問を持ってStringBufferのソースコードを調べましたか?
StringBufferとStringBuilderはAbstractStringBuilderに継承され、最下位の論理はこのクラスに含まれています.Cではchar[]配列で文字列を実現する文字列はありません.StringBufferの下部もchar[]で、配列が初期化されるとサイズが決まりますが、appendが配列サイズを超えているに違いない場合は、超大容量の配列を定義するかどうか、スペースがもったいないのではないでしょうか.ArrayListの実装のように、動的拡張を採用し、appendがまず容量をチェックするたびに、容量が足りない場合は先に拡張し、元の配列の内容を拡張後の配列にコピーするのは簡単で、他にはありません.
 public AbstractStringBuilder append(String str) {
        if (str == null) str = "null";
        int len = str.length();
        ensureCapacityInternal(count + len);//        ,       
        str.getChars(0, len, value, count);//getChars    native array copy,    
        count += len;
        return this;
    }

 
2.StringBufferとStringBuilderの違いは?
StringBufferの操作にsynchronizedを加えると、StringBuilderは効率的ではありません.もし私たちが方法で宣言して使用すれば、局所変数であり、この方法体がStringBuilderを使用するのは効率的です.StringBufferは同時アクセスのシーンに適しています
3.StringBufferとStringBuilderの効率的な使用方法
Stringの大きさがわかるように、public StringBuffer(int capacity)で容量を指定し、より少ない動的拡張を避ける