String
の変更
実行時に値が更新されない
s = "value2";
Java では、プリミティブ型を除き、他のすべての変数はオブジェクトへの参照です。これは、 のみs
が新しい値を指していることを意味します。
不変性は、オブジェクトの状態が構築後に変更できないことを保証します。String
つまり、 Java ではオブジェクトの内容を変更する手段がありません。たとえば、新しいs = s+"a";
文字列を作成したと述べた場合、それはどういうわけか新しいテキストを保存します。
ガベージ コレクション
この回答は、すでに詳細な回答を提供しています。完全な回答を読みたくない場合の簡単な要約の下に、詳細が省略されています。
デフォルトでnew String(...)
は、オブジェクトはインターンされないため、ガベージ コレクションの通常のルールが適用されます。これらは単なるオブジェクトです。
インターンされているコード内の定数文字列は、最終的にこれらを参照する可能性が高いため、通常は削除されません。
ただし、クラスが動的に (アン) ロードされることがあり、その場合、リテラルをプールから削除できるという補足があります。
追加の質問に答えるには:
リテラルを割り当てた後、すぐにヒープからスペースを解放しますか?
いいえ、それはあまり効率的ではありません。ガベージ コレクターは、削除するオブジェクトを分析する必要があります。古い文字列への参照を他のオブジェクトと共有している可能性があるため、オブジェクトをリサイクルできるとは限りません。さらに、オペレーティング システムに追加のメモリを要求する必要がない限り、役に立たなくなったデータを格納しても問題はありません (すべてのデータをハード ディスク ドライブに格納できる限り、コンピュータと比較してください)。 、不要なファイルについて実際に心配する必要はありません。追加のドライブを購入する必要がある瞬間から、最初にいくつかのファイルを削除しようとするでしょう)。分析には、ある程度の計算作業が必要です。一般に、ガベージ コレクタは (ほとんど) メモリが不足している場合にのみ実行されます。だからあなたはすべきだ」
最初のステートメントから 2 番目のステートメントまで、どのような値がどこにあるのか、メモリ領域 (ヒープと文字列プール) に何が起こるのかを誰でも説明できますか?
最初の文字列:
String s = new String("Value1");
ヒープへの参照です。コマンドを呼び出すと、文字列用にヒープにスペースが割り当てられます。
今あなたが電話した場合:
s = "value2";
"value2"
はString Poolの要素であり、プログラムが終了するまでそこに残ります。
古い文字列 ( ) への参照がないためvalue1
、もう。そのオブジェクトはコレクションの候補です。後でガベージ コレクターが通り過ぎると、ヒープからオブジェクトが削除され、空き領域としてマークされます。