0

だから私はこの本を読んでいて、クラスPointを作成し、それを実行してインスタンス化すると、次のPoint p1 = new Point();ようになります。

  • ヒープ上のPointオブジェクト(「new」キーワードの結果)。
  • このオブジェクトへの参照(p1);
  • オブジェクトに参照がない場合は、ガベージコレクターで破棄できます。

意味はわかったと思いますが、考えさせられました。プリミティブ型と文字列で「メモリ的に」何が起こるか、つまり、次の違いは何ですか。

 - int x1 = 100;
 - String s1 = "hello";

 - int x2 = new Integer(100);
 - String s2 = new String("hello");

最初のケースでは、「100」と「hello」がインスタンス化されてヒープに格納されますか?それ以外の場合、x1とs1は何を参照していますか?

ありがとうございました!

4

3 に答える 3

2

初めに:

 int x2 = new Integer(100);

これは、Integerオブジェクトが作成され、送信され(JVMがそのオブジェクトを返すintValue) 、プリミティブに100割り当てられることを意味します。intオブジェクトは参照されなくなり、Integer破棄できます(もちろん、JITはそれを最適化できますint x2 = 100)。

属性はオブジェクトの一部であり、ヒープ内にあるため、ローカル変数について話していると思います。

 int x1 = 100;

int変数がスタックで宣言され、値が割り当てられます

 String s1 = "Hello";

Stringオブジェクトが作成され(または参照されます。を参照String.intern())、ポインタがスタックに追加されます。

他の可能性はまったく同じです。

于 2012-07-11T16:24:16.650 に答える
1

ローカルプリミティブはスタックに配置されますが、オブジェクトのメンバーフィールドは、そのオブジェクトとともにヒープに配置されます(プリミティブであるかどうかは関係ありません)。ここにいくつかの詳細情報。

文字列はオブジェクトであり、ヒープ上に存在します。ただし、動作は少し異なります。ここにいくつかの情報があります。

于 2012-07-11T16:23:37.107 に答える
0

S1とS2はどちらも、値が格納されている場所に新しいメモリ参照を作成します。プリミティブデータ型は、状況に応じてスタックまたはヒープを参照する場合があります。あなたはここで見ることができます

于 2012-07-11T16:29:27.050 に答える