So where does the object holding "Hello" go
"Hello" への参照 str には新しい値が割り当てられるため、値 "Hello" への参照は失われますが、まだプール内にあり、利用可能です。ガベージ コレクターはそれを収集してヒープから削除する可能性があります。正確にはわかりません。 、将来のコードでまだ「Hello」文字列を使用しているとしましょう
String againhello= "Hello" ;
この場合、ガベージ コレクターはそれを収集するべきではありません。"Hello" 文字列が作成され、まだ使用されているため、新しい参照のみが割り当てられているためです。
オブジェクトの可変性と不変性の背後にある概念は、2 つのオブジェクトが同じ値を持つ場合、同じハッシュコードを持ち、equals メソッドに対して true を返す必要があることです。これは String オブジェクトに対しても当てはまりますが、パフォーマンスを向上させるために
彼らは String を不変として設定します。たとえば、ヒープが同じ値と異なるオブジェクトの数で満たされることを望まないためです。
String sre="Hello";
String str="Hello";
String の不変性がなければ、 heap には 2 つのオブジェクトがありますが、 object は 1 つしかなく、参照変数は 2 つしかありません。
what is difference between String and StringBuilder class.
StringBuilder クラスが Java 5 に追加され、StringBuffer と同様の機能が提供されました (つまり、変更可能な string )。 string が変更されるたびに、新しいオブジェクトが作成されなくなりました。 StringBuilder を使用する利点は、StringBuffer が同期されているため、StringBuffer よりも比較的高速であることです。クラスですが、StringBuilder はそうではないため、スレッドの安全性が問題にならない環境で StringBuffer を使用する場合は、パフォーマンスを向上させるために StringBuilder を使用することを検討してください。
デフォルトでは、すべての Java クラスは変更可能です。つまり、インスタンスの内容を変更できます。しかし、不変性が提供する利点はほとんどないため ( http://download.oracle.com/javase/tutorial/essential/concurrency/immutable.html )、一部のクラスを final としてマークすることで不変にするのはそのためです。問題のクラスは String クラスと Wrapper クラスであり、それら (不変クラス) について論理的に考えると、提供されたリンクの説明が理にかなっています。2 つのそれぞれに個別に対処しましょう。
String class:
Kathy Siera と Bert Bates が SCJP の 433 ページで述べたように、アプリケーションが成長するにつれて、プログラムの文字列リテラルに多くの冗長性が生じることは非常に一般的です。したがって、この問題に対処するために、Java の設計者は、使用可能なメモリを効率的に使用してパフォーマンスを向上させる String プールの概念を思いつきました。しかし、ご想像のとおり、いくつかの参照変数が知らないうちに同じ文字列を参照している場合、それらのいずれかが文字列の値を変更できるとしたら、それは悪いことです。したがって、この String クラスを不変にする必要が生じました。
Wrapper classes:
ラッパー クラスを作成する目的の 1 つは、プリミティブをオブジェクト用に予約されたアクティビティ (コレクションへの追加や、オブジェクトの戻り値を持つメソッドから返されるなど) を処理するメカニズムを提供することです。コレクションについて考えると、複数のスレッドからアクセスされることがよくあります。ラッパー クラスが変更可能でない場合、同時変更のリスクが発生し、一貫性のない状態が発生する可能性があります。したがって、競合を避けるために、ラッパー クラスは不変になります。
したがって、一般に、不変クラスに出くわすときはいつでも、そのインスタンスが並行して使用されていると考えるのが論理的です。また、オブジェクトの内容を変更したくない場合 (理由の 1 つは同時アクセスです)、クラスを不変にします。