1

以下のように文字列オブジェクトを作成しました

ケース1:

  String s1="mystring";//Address location is 1000
  String s1="yourstring";
  String s2="mystring";

ケース2:

  String s1=new String("mystring");//Address location is 1000
  String s1=new String("yourstring");
  String s2=new String("mystring");

参照付き。

私の知る限り、これらの文字列は、特定のメモリ位置を持つCase1の文字列定数プールに格納されます。同様に、case2のオブジェクトはヒープメモリに作成されます。同じまたは異なる文字列をStringオブジェクトに割り当てる場合、これらのメモリはガベージコレクタによってどのように管理および解放されますか。

4

6 に答える 6

2

C++ から来た場合、すべてがヒープ上にあります。また、文字列は Java では不変です (作成後に変更することはできません)。ガベージ コレクタがあるため、明示的に解放する必要はありません。

于 2012-05-02T07:05:22.997 に答える
1

アプリケーションは、最初に割り当てられた現在のメモリに依存します。新しい文字列を作成すると、文字列のサイズのメモリが割り当てられます。十分なメモリがない場合、ヒープが使い果たされているため、エラーがスローされます。オブジェクトに参照がなくなると、メモリを解放するのはガベージ コレクタです。それを制御することはできません。

しかし、現時点では、現在のコードは String を作成する際のエラーでコンパイルされません:)

于 2012-05-02T07:09:09.723 に答える
0

文字列は、Case1(リテラル文字列) の文字列定数プールに格納されます。ケース 2 の場合、新しいオブジェクトを使用して文字列を作成しても、オブジェクトの内容がチェックされます。リテラル文字列オブジェクトのコンテンツと等しい場合、オブジェクト参照はリテラル文字列オブジェクトを指します。

ガベージ コレクション : オブジェクト参照が文字列リテラル オブジェクト "mystring" (あなたの場合) を指していない場合、ガベージ コレクションは行われず、これらのオブジェクトはプログラムの存続期間まで残ります。プログラムが終了すると、文字列リテラル オブジェクトは削除されます。他の文字列オブジェクト、つまりキーワード new を使用する場合、オブジェクト参照がそのオブジェクトを指していない場合、それらはガベージ コレクションされます。

于 2012-05-02T07:10:08.687 に答える
0

ストリングインターンを考えていると思います。ただし、どちらの場合も文字列リテラルが関係するため、どちらの場合でも文字列インターンが発生します。ケース 2 は確かに、ケース 1 に対するメモリの最適化ではありません。

Java で "new String(...)" という式の目的は何ですか?同様の質問を見てください。

于 2012-05-02T07:39:20.470 に答える
0

Java に関する私の理解では、最初の形式 (= 演算子を使用) では、文字列は Java によって維持される文字列のプールから割り当てられます。したがって、最初のケースでは"mystring"、変数に割り当てると、が最初に作成されs2たときに存在したのと同じ文字列への参照が割り当てられます。s1

ただし、コンストラクターを使用する場合は、String オブジェクトのまったく新しいインスタンスを作成します。したがって、3 つの異なる文字列への 3 つの参照が存在します。

メモリに関する限り、Java はガベージ コレクタを、JVM が動作している限り実行されるデーモン スレッドとして実装します。参照がないすべてのオブジェクトが削除されます。したがって、最初のケースではガベージ コレクションはありませんが、2 番目のケースでは 1 つの文字列がガベージ コレクションになります。

于 2012-05-02T07:28:32.173 に答える