3

私はデータ構造に関するこの本を読んでおり、Java のメモリ管理と孤立したオブジェクトについて説明しています。教科書には次のように書かれています。

たとえば、左の図の 3 つの割り当てステートメントについて考えてみましょう。3 番目の割り当てステートメントの後、 a と b が同じ Date オブジェクト (2011 年 1 月 1 日) を参照するだけでなく、b初期化するために作成および使用された Date オブジェクトへの参照がなくなり ます。そのオブジェクトへの唯一の参照は変数bにあり、この参照は割り当てによって上書きされたため、オブジェクトを再度参照する方法はありません。このようなオブジェクトは、孤立していると言われます。

コード:

Date a=new Date(12, 31, 1999);
Date b=new Date(1, 1, 2011);
b=a;

その発言は本当ですか?a の参照 (オブジェクトのメモリ位置はDate(12, 31, 1999)b の参照と同じであるべきではありませんか? これは 1 つの大きなエラーのように思えますが、孤立したオブジェクトである 12、31、1999 のメモリ ブロックを示す画像さえあります。

写真: http://imageshack.us/f/818/3tkx.jpg/

4

6 に答える 6

7

Java では、常に右側の何かを左側への参照に割り当てます。

したがって、ステートメントは次のように言います。

  1. Date新しいオブジェクトDate(12, 31, 1999)を変数に割り当てますa
  2. Date新しいオブジェクトDate(91, 1, 2011)を変数に割り当てますb
  3. variable の参照を variableに代入aしますb

したがって、これらの手順に従うと、次のようになります。

  1. a-> Date(12, 31, 1999)

  2. a-> Date(12, 31, 1999) b-> Date(1, 1, 2011)

  3. a-> Date(12, 31, 1999) b-> Date(12, 31, 1999)

Date(1, 1, 2011)この割り当ての後、アプリケーションからアクセスできないため、 の元のオブジェクトは参照されなくなることに注意してください。元の参照変数bは上書きされ、オブジェクトDate(12, 31, 1999)は と の両方から参照されるようaになりbました。Date(91, 1, 2011)孤立しており、ガベージ コレクションの準備ができています。

剣と斧を持っていると想像してください。まず剣を手に取ります。次に、斧を拾います。その後、剣を下ろし、手に持ったままの斧を両手で引きずります。その後、落とした剣は持たない(紛失)。

編集: 本の著者に感謝すると伝えた場合、これは誤りです。

于 2013-08-05T09:56:53.503 に答える
2

そうです、孤立したオブジェクトは によって指されたものbであり、それはDate(1, 1, 2011)です。写真がそうでなければ、それは間違いなく間違っています。

a --> 31.12.1999     b --> 1.1.2011

                 |
                \ /

a --> 31.12.1999 <-- b     1.1.2011 (orphaned!)
于 2013-08-05T09:56:34.410 に答える
2

ええ、

(2011/1/1)

文中が間違っています。編集ミスの可能性が高いです。それ以外はすべて正しいです。b は a の内容である Date(12, 31, 1999) で上書きされます。したがって、両方の変数は Date(12, 31, 1999) を指し、Date(1, 1, 2011) は孤立しており、ガベージ コレクションの対象になります。

本の正誤表を確認する必要があるかもしれません。:-)

于 2013-08-05T09:57:16.940 に答える
2

aメモリの場所に格納されている Date オブジェクトを参照しているとしましょう123。同じロジックで、 がbメモリ ロケーション546.(新しいオブジェクトの新しいロケーション) に格納されている Date オブジェクトを参照しているとします。

今あなたがするときb = abは を指していObject @ 123ます。546アクセスできなくなり、いつでも GC できます。

于 2013-08-05T09:58:40.940 に答える
2

このb=aステートメントは の現在の値を破棄しますb。また、b と呼ばれる日付オブジェクトへの他の参照がないため、はい、b 日付は孤立しています。

于 2013-08-05T09:53:27.470 に答える
1

文は誤りです(説明は問題ありませんが、彼はオブジェクトを混乱させています)

  • で作成されたオブジェクトは、とnew Date(12, 31, 1999)によって 2 回参照されます。ab
  • で作成されたオブジェクトは、割り当てnew Date(91, 1, 2011)後に他の誰からも参照されないb=aため、メモリから削除されます
于 2013-08-05T09:53:37.217 に答える