我正在使用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,因为它指向它?如何避免这种情况?
答案 0 :(得分:5)
要进行克隆,您必须像使用HashMap
构造函数HashMap(Map m)
Map<String,Integer> GeneMapClone = new HashMap<>(GeneMap);
因为当前GeneMap
和GeneMapClone
都指向堆内存中的同一对象
答案 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中的驼峰式变量名。这导致阅读该帖子有些困惑。