我不明白我的输出。为什么我两次得到同样的东西?

时间:2013-08-27 11:08:33

标签: java map hashmap key

以下程序维护名为:

的2个数据结构
map of type HashMap
map_1 also of type HashMap

在开头map填充key : 1value : suhail。然后,使用键map_1将此地图插入20

map再次填充key : 1和另一个value : CSE。此地图再次插入map_1

import java.util.*;

class KeyTest {
    public static void main(String args[]) {
        Map<Integer,String> map = new HashMap<Integer,String>();

        Map<Integer,Object> map_1 = new HashMap<Integer,Object>();

        map.put(1,"suhail");

        map_1.put(20,map);

        map.put(1,"CSE");

        map_1.put(21,map);

        Set<Integer> keys = map_1.keySet();
        Iterator i = keys.iterator();
        while(i.hasNext()) {
            System.out.println(map_1.get((Integer)i.next()));
        }

    }
}

当我打印map_1值时,这就是我得到的:

{1=CSE}
{1=CSE}

但这不是我所期待的。根据我的说法,程序应该如何运行:

[1,suhail]--> map
[20,[1,suhail]]---> map_1
[1,CSE]--> map (A replace, because of the same keys)
[21,[1,CSE]]--->map_1

所以输出应该是:

[1,suhail]
[1,CSE]

任何人都可以解释一下,为什么我没有得到这个输出

5 个答案:

答案 0 :(得分:4)

将对象map插入map_1时,不会复制它。当您在map_1之外修改它时,也会修改存储的对象,因为它是同一个对象。

将新地图重新分配给map以解决此问题:

Map<Integer,Object> map_1 = new HashMap<Integer,Object>();
Map<Integer,String> map = new HashMap<Integer,String>();

map.put(1,"suhail");
// The first "map" object gets inserted
map_1.put(20,map);

// Make a new object
map = new HashMap<Integer,String>();

map.put(1,"CSE");
// Now the second object gets inserted
map_1.put(21,map);

答案 1 :(得分:0)

在地图中,您可以为一个value设置一个key,这样如果您再次将某些内容放在将被新对象替换的相同键上。因此,当您在key:1上再次放置某些内容时,该值将被替换。您必须创建一个新对象来绕过该行为意味着新地图。

并且您已将map ref放在map1中,因此在编辑它时,其内部副本也会被修改。

答案 2 :(得分:0)

那是因为你要覆盖同一个Map实例中的最后一个值。

map <- [1: "suhail"]
map_1 <- [20: [1: "suhail"]]

map <- 1, 'CSE' (you lost "suhail", overwriting key 1) [1: "CSE"]
map_1 <- 21, map, same object in two different keys. [20: [1: "CSE"], 21: [1: "CSE"]]

在这种情况下,您在map_1中拥有与两个不同键相关的相同实例。

要做你想做的事,你必须为map创建一个新的Map实例。

import java.util.*;

class KeyTest {
    public static void main(String args[]) {
        Map<Integer,String> map = new HashMap<Integer,String>();

        Map<Integer,Object> map_1 = new HashMap<Integer,Object>();

        map.put(1,"suhail");

        map_1.put(20,map);

        map = new HashMap<Integer,String>();
        map.put(1,"CSE");

        map_1.put(21,map);

        Set<Integer> keys = map_1.keySet();
        Iterator i = keys.iterator();
        while(i.hasNext()) {
            System.out.println(map_1.get((Integer)i.next()));
        }

    }
}

答案 3 :(得分:0)

输出正确,在下面的陈述中

map.put(1,"suhail"); 
//--> map has [1 = suhail]
map_1.put(20,map);  
//--> map1 has [20 = [1 = suhail]]
map.put(1,"CSE"); 
//--> You are modifying the same map reference, hence now map is [1 = "CSE"]
map_1.put(21,map); 
//--> you are putting the same map ref to map1 with new key so map1 is [20 = [1 = "CSE"], [21 = [1 = "CSE"]]

由于您使用的是相同的 map对象,因此输出就是这样。如果您要创建新的map,则可能需要为HashMap map引用新的{{1}}

您只打印值,因此输出

答案 4 :(得分:0)

这是因为您在地图中存储了对象的引用,而不是它的值。 在map_1中,键20和21都链接到同一个对象(地图)。 如果您希望它们不同(例如在循环中),则必须为每个键创建一个新的地图对象。

顺便说一句,你只是打印值,而不是键,这就是为什么20和21没有显示在你的输出中(假设这是问题的一部分,当然)

这是希望它有所帮助。