String、StringBuilder、StringBufferの比較

Sting / stringBuffer / StringBuilderの違いがよくわからないことが多いので、ブログを書いて要約してください。

Stringの値は変更できず、Stringに対する各操作は新しいオブジェクトを生成し、多くのスペースを浪費します
。Stringbuffer値は変更可能、効率は一般的、スレッドセーフな
StringBuilder値は変更可能、効率は高い、スレッドはそうではない安全

1.3つの値の変動性

文字列は、実際には文字列の下部にある固定長の文字配列であるため、不変です。
Stringの元のコードを見てください。

/** The value is used for character storage. */
    private final char value[];

 public String(char value[]) {
    
    
        this.value = Arrays.copyOf(value, value.length);
    }

定義された文字列の長さに従って長さが指定されていることがわかります。したがって、その長さを変更する方法はありません。Stringを操作すると、新しいオブジェクトが生成されます。これは新しい配列でもあります。Stringを使用してループ内で変更を加えると、多くのスペースが無駄になると想像してみてください。
StringBuilderとStringBufferのソースコードを見てみましょう。

public StringBuilder(String str) {
    
    
        super(str.length() + 16);
        append(str);
    }
 public StringBuffer(String str) {
    
    
        super(str.length() + 16);
        append(str);
    }

StringbufferとStringBuilderの値を変更できることがわかります。

2. String、StringBuffer、StringBuilder間の継承関係

ここに画像の説明を挿入します
3つのソースコードから3つの継承関係を観察することができます。

3. String、StringBuffer、Stringbuilderの効率

まず、stringBuilderはStringBuilderの後に作成されました。スレッドセーフについて言及されていない場合は、もちろんStringBuilderが最速です。
次に、Stringを見てみましょう。

String str="hello"+"world";//代码1
String s1="hello";
String s2="world";
String s12=s1+s2;//代码2
StringBuilder sb=new StringBuilder(s1);
sb.append(s2);//代码3

上記のコードを確認します。コード1は定数+演算、コード2は変数+演算、
コード1:実際、コード "hello" + "world"はコンパイルフェーズ中に接続され、の文字列ペアを指します。ヒープそれのように、それが実行されたら、それを山から取り出します。ローカル変数strに格納されます。ピックアンドプレース操作のようです。
コード2:Stringが+操作を使用する場合、実際には3つのステップに分割されます。
(1)Stringbuilder temp = new StringBuilder(s1);
(2)temp.append(s2);
(3)str = temp.toString();
+記号だけでこれらの3つのステップを実行し、StringオブジェクトとStringbuilderオブジェクトを同時に作成します。ループが数万回の場合、数万の2つのオブジェクトが作成されます。時間の無駄ではありませんか。とスペース?
コード3:最下層で行われるのは、文字配列の長さを継続的に拡張してから、元の配列の後ろに新しいコンテンツを貼り付けることです。ただ拡張と物事をしました。
概要:StringbuilderとStringbufferは、appendを使用する際に最も効率が高くなります。

4. String、StringBuffer、StringBuilderのセキュリティ問題

stringbufferがスレッドセーフであるのに、Stringbuilderスレッドが安全でないのはなぜですか?両方のソースコードを見ることができます。Stringbufferの多くのメソッドは、Synchronizedによって変更されます。ご存知のように、メソッドに同期変更が追加される、つまりロックが追加されます。オブジェクトがロックを取得すると、メソッド内の操作を実行できます。このとき、他のスレッドはロックを取得できません。操作安全でない現象を引き起こしません。もちろん、シングルスレッドの場合、誰もロックを取得できません。StringbufferはStringbuilderと同じくらい安全です。
文字列は値を変更できません。変更すると新しいオブジェクトが生成されるので安全です。

おすすめ

転載: blog.csdn.net/weixin_43815275/article/details/113846296