0

Java メモリの使用について質問があります。それは私の啓発のためであり、後でこれを検索して見つける他の人のためです! 質問の目的のために、これは単一の方法であり、範囲外のものは何もないと仮定してください...私の質問中に;-)

タイプ String の「name」という単一のプロパティを持つ 5 つの新しいオブジェクトを作成しました。ArrayList を作成し、5 つのオブジェクトを ArrayList に追加します。次に、HashMap を作成し、以前に作成した ArrayList を反復処理して、オブジェクトを HashMap に追加します。

Q1. オブジェクトを ArrayList から HashMap に追加するとき、「new」キーワードを使用していないため、別の「ポインター」のコレクションを作成しているだけだと思います。したがって、HashMap 自体を除いて、新しいメモリは消費されません (オブジェクトは複製されません)。

Q2. HashMap のオブジェクトの「name」の値を変更すると、変更後に ArrayList を反復処理すると、同じ変更が見られます。

私の理解に関する「健全性チェック」に感謝します。

4

3 に答える 3

3

Q1: HashMap が作成され、オブジェクトへの参照が作成されます。したがって、メモリは消費されますが、参照はそれほど大きくはありませんが、参照の数が膨大な場合は違いが生じる可能性があります。

Q2: 編集: はい、名前フィールドが変更されます。さらに良いのは、それをチェックする小さなプログラムを作成することです。

于 2013-01-01T04:10:59.377 に答える
0

A1 : はい、参照と HashMap 以外に新しいものは作成されません。(HashMap のキーの新しいセットを作成していないと仮定します)

A2 : はい、変更は ArrayList に反映されます。

于 2013-01-01T04:19:25.003 に答える
0

ご質問にお答えします。

1.) オブジェクトを に追加してもHashMap、オブジェクトは複製されません。内部的には、マップは内部構造を維持するために新しいオブジェクトを作成します。マップの内部構造は、HashMap.Entryすべての値が同じハッシュ コードにマップされるリンク リストを含むオブジェクトで構成されます。したがって、マップにオブジェクトを追加するたびに、1 つ以上の内部オブジェクトが作成されます。

HashMap2.) オブジェクトの名前をキーとして使用してオブジェクトを格納したと仮定します。この場合、オブジェクトの名前を変更すると、オブジェクトは更新されますが (リストまたはマップのどちらからアクセスされているかに関係なく、常に同じオブジェクトです)、マップ内のマッピングは更新されません。マップでは、オブジェクトはまだ古い名前で保存されます!

 Map map = new HashMap();
 Foo f = new Foo();
 f.setName("A");
 map.put(f.getName(),f);
 f.getName(); // => "A"
 map.get("A"); // => f
 f.setName("B");
 f.getName(); // => "B"
 map.get("B"); // => null
 map.get("A"); // => f
于 2013-01-03T01:16:01.987 に答える