地图为空

时间:2018-08-30 21:20:48

标签: java dictionary null

我正在使用Map,将其克隆并使用克隆。使用克隆之后,原始的Map会被修改,我不明白为什么。

hello.so

这将打印出以下内容:

System.out.println("foo = " + GeneMap.get("foo"));
Map<String,Integer> GeneMapClone = GeneMap;
for(int i = 0; i<BestArray.length; i++) {
    for(Map.Entry<String,Integer>entry:GeneMapClone.entrySet()){
        if(BestArray[i] == entry.getValue()) {
            GeneArray[i] = entry.getKey();
            GeneMapClone.remove(entry.getKey());
            break;
        }
    }
}
System.out.println("foo = " + GeneMap.get("foo"));

通过修改GeneMapClone,我是否也在修改GeneMap,因为它指向它?如何避免这种情况?

3 个答案:

答案 0 :(得分:5)

要进行克隆,您必须像使用HashMap构造函数HashMap(Map m)

 Map<String,Integer> GeneMapClone = new HashMap<>(GeneMap);

因为当前GeneMapGeneMapClone都指向堆内存中的同一对象

答案 1 :(得分:1)

在您的代码中

  

Map GeneMapClone = GeneMap;

您将GeneMapClone指向原始对象,即GeneMap而不是克隆对象
如果两个都指向同一个对象,则改变一个也将改变另一个

答案 2 :(得分:1)

您实际上并不是在克隆地图。您只是将一个新变量指向现有的单个地图对象。

请参见以下代码中的注释。

    // Making variables for the code to compile
    Integer [] BestArray = new Integer[100];
    String[] GeneArray = new String[100];
    Map<String, Integer> GeneMap = new HashMap<>();

    System.out.println("foo = " + GeneMap.get("foo"));

    // The below line doesn't clone `GeneMap`
    // It creates a new variable named `GeneMapClone` which points to the one map copy which is 'GeneMap'
    // So after the below line, there's still just 1 map in memory, pointed at by 2 differently-named variables
    Map<String,Integer> GeneMapClone = GeneMap;
    for(int i = 0; i<BestArray.length; i++) {
        for(Map.Entry<String,Integer>entry:GeneMapClone.entrySet()){
            if(BestArray[i] == entry.getValue()) {
                GeneArray[i] = entry.getKey();
                GeneMapClone.remove(entry.getKey());
                break;
            }
        }
    }
    System.out.println("foo = " + GeneMap.get("foo"));

另外,FWIW,典型约定是Java中的驼峰式变量名。这导致阅读该帖子有些困惑。