JavaエッセイString、StringBuffer、StringBuilderクラス

String、StringBuffer、StringBuilderの違い

Stringオブジェクトの作成における2つの違い

概要:文字列型のインスタンスは、固定長(一度は不変)の文字列です。文字列文字列変数が直接割り当てられている場合、それは「永続世代」に格納されている文字列定数変数と見なされ、複数の文字列は同じです。定数変数はメモリの一部を共有します。文字列変数がnewString( "")を呼び出して変数を作成すると、newが呼び出されるため、変数は「新世代」に格納され、メモリの一部のみを占有します。jdk1.8以降、永続的な世代はMetasspaceと呼ばれます

`文字列text1 =“ 1234567”;
文字列text2 =“ 1234567”;
String text3 = new String(“ 1234567”);
String text4 = new String(“ 1234567”);

    System.out.println(text1 == text2);
    System.out.println(text1 == text3);
    System.out.println(text1 == text4);
    System.out.println(text3 == text4);`

「1234567」が変数に割り当てられていない場合、それは匿名オブジェクトです。つまり、StringクラスのオブジェクトはStringメソッドを直接呼び出すことができます。「1234567」はtext1とtext2に割り当てられた匿名の文字列定数オブジェクトアドレスであるため(Stringクラスのインスタンスは実際にはchar []配列を介して格納され、理論メモリの文字列定数プールに格納されます。メソッド領域は実際にはしたがって、text1とtext2は文字列定数変数であり、メモリの一部、つまりtext1 == text2を共有していることは明らかです。ただし、
String text3 = new String( "1234567"); String text4 = new String( "1234567");
明らかに、この1234567文字列はnewによって新しく生成されたメモリに格納され、text3の値は新しく生成されたメモリアドレスです。 text4同じことが当てはまり、text3とtext4は2つのメモリです。したがって、text3!= text4を予測することは難しくありません。
ここに画像の説明を挿入
実行結果を図に示します。

文字列の複数の文字列を連結する2つの方法の違い

1つ目は最も単純で最も便利な+記号で、2つ目はappend(String str)メソッドを呼び出すことです。

`String text5 ="草を刈る日の正午 ";
String text6 ="土の下に滴る汗 ";
String text7 ="ベッドの
前の月明かり "; text5 = text5 + text6 + text7;
System.out。 println(text5);

    StringBuilder sb = new StringBuilder();
    sb.append("锄禾日当午");
    sb.append("汗滴禾下土");
    sb.append("床前明月光");
    String text8 = sb.toString();
    System.out.println(text8);`

最初の方法:text5 + text6は新しい文字列を生成し、メモリ内にアドレスを持ちます。(text5 + text6)+ text7はメモリ内のアドレスを持つ新しい文字列を生成し、新しい文字列アドレスの合計はtext5の後、元のtext5が指す文字列はガベージになり、生成された文字列(text5 + text6)もガベージになります。String型で宣言された文字列変数に格納されている文字列は文字列定数プールの定数であるため、永続世代に格納されます。 、ガベージコレクターGCは時間内にそれを収集しません。+記号を使用して複数の文字列をスプライスすると、多くの新しい文字列がガベージになり、メモリスペースを占有することがわかります。文字列が多い場合は最善を尽くしてくださいスプライスするデータ。+を使用して文字列を連結することは避けてください。

2番目のメソッド:StringBuilderクラスとStringBufferクラスには追加メソッドがありますが、Stringクラスにはありません。appendメソッドはStringBuilderまたはStringBuffeオブジェクトを返します。Stringbufferは実際には動的文字列配列であり、append()は動的文字列配列に追加します。Stringtext1+ text2は、2つの文字列を連結し、それらを新しいメモリアドレスに配置します。次にStringBufferとStringBuilderは動的配列です。スプライシング後も、メモリアドレスは動的配列の最初のアドレスであるため、メモリガベージが占有されることはありません。appendはオブジェクトを返すため、Xu YaoはtoStringメソッドを呼び出してオブジェクトを文字列に変換し、出力します。

StringBufferとStringBuilderのメソッドは基本的に同じですが、2つの操作は一緒にスプライスされたときに同じであり、3つの主な違いは次のとおりです:
StringBuilderマルチスレッド同時操作は安全ではありません;(読み取りおよび書き込みエラーとデッドロックが発生する可能性があります)状況)
StringBufferマルチスレッドセーフの実現。
文字列はシングルスレッドであり、複数のスレッドで同時に操作することはできません。

理解を深めるために、Javaの文字列が不変として定義されている理由を読むことをお勧めします

おすすめ

転載: blog.csdn.net/qq_40694640/article/details/112598478