1

自分で解決できなかったり、Web で見つけられなかった質問に直面したとき、私は HashMaps を使用してきました。

HashMap<String,HashMap<String,String>> m= new HashMap<>();
HashMap<String,String> t = new HashMap<>();

t.put("test1","1");
m.put("h1",t);

t = new HashMap<>();
t.put("test2,"2");
m.put("h2",t);

System.out.println(m);

つまり{h1={test1=1}, h2={test2=2}} 、大きな HashMap には両方の HashMap のデータが含まれています。問題は、単純に小さな HashMap のデータをコピーしたのか、それとも "t" の HashMap を両方とも JVM メモリに保持し、HashMapmが私をそれらにリンクしているだけなのかということです。

4

5 に答える 5

1

bigHashMapには both への参照が含まれていますHashMaps。あなたがしたことHashMap tは、指しているものも変更されています。

より視覚的な例として

t = 0x00000001

に入れるtmm次のようになります

m = {0x00000001}

この時点で、 と の両方tm同じ への参照を持っていますHashMap。つまり、一方への変更は他方に表示されます。あなたが行くとき、t = new HashMap<>()あなたは実際にt指す参照を再割り当てしています

t = 0x00000002

しかし、最初の参照を失うことはありませんでしたm。そして、2回目{0x00000001}に入れるtと、次のようになりますm

t = 0x00000002
m = {0x00000001, 0x00000002}

結局、m両方への参照がまだ含まれていますHashMaps

于 2013-04-18T05:32:41.743 に答える
0

tに配置するたびmに、データのコピーは作成されません。代わりに、サブマップへの参照が配置されます。

2回追加tします。mただし、各時刻tは異なるオブジェクトを指します。したがって、最終的に には 2 つの別個の独立したサブマップが作成されmます。

これを次の例と比較してください。

      t.put("subkey","old");
      m.put("h1",t);
      m.put("h2",t);
      t.put("subkey", "new");
      System.out.println(m);

これは印刷されます

{h1={subkey=new}, h2={subkey=new}}

ここではt、両方のキーがm同じサブマップを指しています。一つ変えると全部変わる。

于 2013-04-18T05:26:54.350 に答える
0

Mapオブジェクトの cotains 参照。内部にはEntry、キー、値オブジェクト参照を保持するクラスの配列バケットが含まれています。

HashMapm には、h1 に対する最初に作成されたハッシュマップのオブジェクト参照と、h2 に対する 2 番目のハッシュマップの参照が含まれます。

于 2013-04-18T05:27:02.687 に答える
0

両方の HashMap がメモリに残ります。キー h1 と h2 を使用して、ハッシュマップ m を介してそれらを参照できます。データはハッシュマップからコピーされませんが、オブジェクトの参照はハッシュマップ キー (つまり、h1 & h2) に変更されます。

于 2013-04-18T05:32:48.463 に答える