2013-10-24 112 views
3

我试图将HashMap存储在另一个HashMap中,但第一次插入的值作为第二次插入值而更改。在HashMap中存储HashMap

这是我的代码。

HashMap<String ,HashMap<Integer ,Integer>> map1=new HashMap<>(); 
    HashMap<Integer ,Integer> map2=new HashMap<>(); 
    map2.put(1,1); 
    map2.put(2,1); 
    map2.put(3,1); 
    map1.put("1", map2); 
    System.out.println("After Inserting first value "+map1.entrySet()); 
    /* OutPut: After Inserting first value [1={1=1, 2=1, 3=1}]*/ 

    map2.clear(); //i cleared map 2 values 

    map2.put(4,2); 
    map2.put(5,2); 
    map2.put(6,2); 
    map1.put("2", map2); 
    System.out.println("After Inserting second value "+map1.entrySet()); 
    /*output : After Inserting second value [2={4=2, 5=2, 6=2}, 1={4=2, 5=2, 6=2}]*/ 

我第一次插入第二“键,值”之后[2={4=2, 5=2, 6=2}, 1={4=2, 5=2, 6=2}]得到输出作为1={1=1, 2=1, 3=1}] 我键“1”的值变更为“2”键。

+2

明确影响您存储的对象。放不做副本,它直接引用该对象。你需要创建一个新的实例。 – njzk2

回答

4

你需要第二put()呼叫

// map2.clear(); 
map2 = new HashMap<Integer, Integer>(); 

Map#clear()之前创建的HashMap一个新的实例给你一个Map实例。因此,map112最终都会重复使用相同的map2的实例,因此您会看到所有值都重复出现。

尝试Map#clear()后,打印您的Map容器和增加新的价值

map2.clear(); //i cleared map 2 values 
System.out.println("After clearing "+map1.entrySet()); 

map2.put(4,2); 
map2.put(5,2); 
map2.put(6,2); 
System.out.println("After adding new values "+map1.entrySet()); 

你可以清楚地看到它影响关键1以及后再次。

输出

After Inserting first value [1={1=1, 2=1, 3=1}] 
After clearing [1={}] 
After adding new values [1={4=2, 5=2, 6=2}] 
After Inserting second value [2={4=2, 5=2, 6=2}, 1={4=2, 5=2, 6=2}] 
0

您存储在map1HashMapmap2一个参考,而不是副本。这就是为什么对map2的所有后续更改也会影响插入到map1中的第一张地图。

0

你不应该清除地图。请注意,您添加的HashMap map2一个与此创建:

HashMap<Integer ,Integer> map2=new HashMap<>(); 

这意味着有一个与ADRESS内存值创建的对象。并且这个地址存储器值被放入“更大”的HashMap中。

如果你清除/更改map2,你还可以在你的更大的HashMap中清除它,因为它只是指向相同的对象!

您必须创建新的实例,所以不是

map2.clear(); 

你必须这样做:

map2=new HashMap<>(); 
0

你的第一个插入的值被改变,因为第一参考指的是MAP2也是如此第二个参考。 map2对象是相同的,它在两个地方被引用。

我猜你想要的东西是每个MAP2

0

尝试清除这两个地图上创建新的对象。有用。

map1.clear(); 
map2.clear();