字符串类StringBuffer和StringBuilder叫字符串缓冲区,请问哪里体现缓冲了?
学习是最好的投资!
Java の文字列は固定長でメモリに保存されるため、文字列へのすべての追加、削除、変更には新しいメモリの作成とメモリのコピーが必要です。
StringBuffer と StringBuilder は、頻繁なメモリの適用を避けるために、通常の String の追加、削除、変更とは異なる方法で処理されます。
たとえば、「a」、「b」、「c」をそれぞれ接合します。 "a" + "b" + "c" を使用すると、(最適化なしで) Java は最初に 2 バイトのメモリを適用し、"a" と "b" をこのメモリにコピーし、次に 3 バイトのメモリを適用します。 「ab」と「c」をこのメモリにコピーします。 StringBuffer または StringBuilder を使用すると、最初に大きなメモリ (デフォルトは 16 バイト) が適用されます。結合するときは、「a」、「b」、および「c」をこのメモリに直接コピーするだけで済みます。繰り返しメモリを申請します。ここで先に申請してから使用するという形は、緩衝地帯の考え方を反映しています。
新しいオブジェクトは生成されません。 + が String で使用されるたびに、新しいオブジェクトが生成されます。もちろん、コンパイラーは短時間でコンパイルの最適化を実行し、バッファーは元のオブジェクトに直接追加され、新しいオブジェクトは生成されません
ここでは StringBuilder を例に挙げます。 StringBuilder の内部ストレージは char 配列を使用して保存されます。内部バッファーが不足している場合、システムは StringBuilder 内の char 配列にコピーします。 .arrayCopy は、非常に効率的な拡張メカニズムの実装に使用されます。これがバッファリングの実装方法です。
String d = "a" + "b" + "c"; は複数の文字列オブジェクトを生成します。上で回答したように、その理由は仮想マシン内に文字列バッファ プールがあるためです。
通常の「a」+「b」+「c」
「ab」文字列オブジェクトを生成します
ただし、これら 2 つのクラスを使用すると、最後の「abc」オブジェクトのみが生成されます
Java の文字列は固定長でメモリに保存されるため、文字列へのすべての追加、削除、変更には新しいメモリの作成とメモリのコピーが必要です。
StringBuffer と StringBuilder は、頻繁なメモリの適用を避けるために、通常の String の追加、削除、変更とは異なる方法で処理されます。
たとえば、「a」、「b」、「c」をそれぞれ接合します。 "a" + "b" + "c" を使用すると、(最適化なしで) Java は最初に 2 バイトのメモリを適用し、"a" と "b" をこのメモリにコピーし、次に 3 バイトのメモリを適用します。 「ab」と「c」をこのメモリにコピーします。 StringBuffer または StringBuilder を使用すると、最初に大きなメモリ (デフォルトは 16 バイト) が適用されます。結合するときは、「a」、「b」、および「c」をこのメモリに直接コピーするだけで済みます。繰り返しメモリを申請します。ここで先に申請してから使用するという形は、緩衝地帯の考え方を反映しています。
新しいオブジェクトは生成されません。 + が String で使用されるたびに、新しいオブジェクトが生成されます。もちろん、コンパイラーは短時間でコンパイルの最適化を実行し、バッファーは元のオブジェクトに直接追加され、新しいオブジェクトは生成されません
。ここでは StringBuilder を例に挙げます。 StringBuilder の内部ストレージは char 配列を使用して保存されます。内部バッファーが不足している場合、システムは StringBuilder 内の char 配列にコピーします。 .arrayCopy は、非常に効率的な拡張メカニズムの実装に使用されます。これがバッファリングの実装方法です。
String d = "a" + "b" + "c"; は複数の文字列オブジェクトを生成します。上で回答したように、その理由は仮想マシン内に文字列バッファ プールがあるためです。
通常の「a」+「b」+「c」
「ab」文字列オブジェクトを生成します
ただし、これら 2 つのクラスを使用すると、最後の「abc」オブジェクトのみが生成されます