9

文字列がリテラルで初期化された場合、文字列プールにスペースが割り当てられ、新しいキーワードで初期化された場合、文字列のオブジェクトが作成されることを理解しました。しかし、私は以下に書かれているケースと混同しています。

私の質問は、 String が new キーワードで作成され、その値がリテラルで更新された場合はどうなるでしょうか?

例えば

String s = new String("Value1");  -- Creates a new object in heap space

次に、次のステートメントを次のように書いたらどうでしょうか。

s = "value2";

だから私の質問は、

1 文字列プールに文字列リテラルを作成しますか、それともそのオブジェクトの値を更新しますか?

2 String プールに新しいリテラルを作成すると、現在存在するオブジェクトはどうなりますか? それは破棄されますか、それともガベージコレクターが呼び出されるまで存在します。

文字列が数千文字の場合、これは小さな文字列であり、使用するスペースが心配です。ですから、私の重要な質問はスペースです。

リテラルを割り当てた後、すぐにヒープからスペースを解放しますか?

最初のステートメントから 2 番目のステートメントまでの値と、メモリ領域 (ヒープと文字列プール) に何が起こるかを誰でも説明できますか?

4

2 に答える 2

9

Stringの変更

実行時に値が更新されない

s = "value2";

Java では、プリミティブ型を除き、他のすべての変数はオブジェクトへの参照です。これは、 のみsが新しい値を指していることを意味します。

不変性は、オブジェクトの状態が構築後に変更できないことを保証します。Stringつまり、 Java ではオブジェクトの内容を変更する手段がありません。たとえば、新しいs = s+"a";文字列を作成したと述べた場合、それはどういうわけか新しいテキストを保存します。

ガベージ コレクション

この回答は、すでに詳細な回答を提供しています。完全な回答を読みたくない場合の簡単な要約の下に、詳細が省略されています。

デフォルトでnew String(...)は、オブジェクトはインターンされないため、ガベージ コレクションの通常のルールが適用されます。これらは単なるオブジェクトです。

インターンされているコード内の定数文字列は、最終的にこれらを参照する可能性が高いため、通常は削除されません。

ただし、クラスが動的に (アン) ロードされることがあり、その場合、リテラルをプールから削除できるという補足があります。


追加の質問に答えるには:

リテラルを割り当てた後、すぐにヒープからスペースを解放しますか?

いいえ、それはあまり効率的ではありません。ガベージ コレクターは、削除するオブジェクトを分析する必要があります。古い文字列への参照を他のオブジェクトと共有している可能性があるため、オブジェクトをリサイクルできるとは限りません。さらに、オペレーティング システムに追加のメモリを要求する必要がない限り、役に立たなくなったデータを格納しても問題はありません (すべてのデータをハード ディスク ドライブに格納できる限り、コンピュータと比較してください)。 、不要なファイルについて実際に心配する必要はありません。追加のドライブを購入する必要がある瞬間から、最初にいくつかのファイルを削除しようとするでしょう)。分析には、ある程度の計算作業が必要です。一般に、ガベージ コレクタは (ほとんど) メモリが不足している場合にのみ実行されます。だからあなたはすべきだ」

最初のステートメントから 2 番目のステートメントまで、どのような値がどこにあるのか、メモリ領域 (ヒープと文字列プール) に何が起こるのかを誰でも説明できますか?

最初の文字列:

String s = new String("Value1");

ヒープへの参照です。コマンドを呼び出すと、文字列用にヒープにスペースが割り当てられます。

今あなたが電話した場合:

s = "value2";

"value2"String Poolの要素であり、プログラムが終了するまでそこに残ります。

古い文字列 ( ) への参照がないためvalue1、もう。そのオブジェクトはコレクションの候補です。後でガベージ コレクターが通り過ぎると、ヒープからオブジェクトが削除され、空き領域としてマークされます。

于 2015-09-14T12:11:34.617 に答える
0

文字列を変更する必要がある場合は、変更を含む新しい文字列をいつでも作成できます。

  • Java は、文字列を変更できるようにする StringBuffer と呼ばれる String のピア クラスを定義します。
于 2015-09-14T12:32:46.283 に答える