Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将地图复制到另一个新地图_Java_Pointers_Hashmap - Fatal编程技术网

Java 将地图复制到另一个新地图

Java 将地图复制到另一个新地图,java,pointers,hashmap,Java,Pointers,Hashmap,我有两个HashMap,如下所示: @Session private Map< Integer, List< ObjectA >> keyMap; @Session private Map< Integer, List< ObjectA >> keyMap2; 然后,我将编辑keyMap中的一些数据。但是,keyMap 2中的值将随着我在keyMap中编辑的内容而改变 据我所知,这是因为keyMap2只是指向keyMap指针,所以keyMap中

我有两个HashMap,如下所示:

@Session
private Map< Integer, List< ObjectA >> keyMap;

@Session
private Map< Integer, List< ObjectA >> keyMap2;
然后,我将编辑
keyMap
中的一些数据。但是,
keyMap 2
中的值将随着我在
keyMap
中编辑的内容而改变

据我所知,这是因为
keyMap2
只是指向
keyMap
指针,所以
keyMap
中的任何更改都将反映在
keyMap2
中,因为相同的指针。(如果我错了,请纠正我。)


我希望保留
keyMap 2
值,而不进行类似
keyMap
的更改。除了我循环
keyMap
并将1乘1放入
keyMap 2
编辑之外的任何想法:如注释中所述,由于通过引用复制包含的列表,原始方法将不起作用

如果使用Java8 streams的方法不起作用,另一种可能是使用以下方法在地图上迭代:

for (keyMap.Entry<Integer, List<ObjectA>> entry : map.entrySet()) {
    //Code
}
for(keyMap.Entry:map.entrySet()){
//代码
}
然后,您可以使用
entry.getKey()
entry.getValue()

如果只需要一个浅拷贝(通过引用复制ObjectA),
新建ArrayList(entry.getValue())
就可以了,但是对于深拷贝(需要ObjectA的新实例),需要关于该对象的更多信息


原件:

您需要完整地复制hashmap

这包括在:

本质上是
private-Map>keyMap2=new-HashMap>(keyMap)


或者
keyMap 2.addAll(keyMap)

您遇到的问题称为别名

为了在您的案例中打破它,您必须:

  • 在类上定义
    clone
    方法
    ObjectA
  • 迭代第一个映射的
    键集
    ,因此:
    • 获取与特定键关联的
      列表
      实例
    • 创建该列表的新实例
    • 迭代前者,克隆包含的元素并将它们放入后者
    • 将新列表与用于获取原始列表的键一起放入第二个映射中

这样,您就可以从头开始创建一个新列表和一整套元素,这些元素在内容上与原始元素相同,但在内存中不是相同的对象。

正如您正确提到的,
keyMap 2
指向与
keyMap
相同的HashMap

但如果你这样做了:

keyMap2 = (HashMap<String, String>) keyMap.clone();
keyMap2=(HashMap)keyMap.clone();
这将复制
keyMap
,并将
keyMap 2
指向该副本。对
keyMap
的任何进一步更改都不会反映在副本中


这将解决您的问题

在Java中,没有指针之类的东西。使用(使用C\C++实现),这样您的更改将不会反映。您可以使用:

keyMap2 = (HashMap<String, String>) keyMap.clone();
同样,这些更改不会反映出来,因为Java中没有
指针


干杯。

您可以像这样使用Java8流进行复制

    Map<String, List<ObjectA>> keyMap2 = keyMap.entrySet().stream()
        .map(e -> new AbstractMap.SimpleEntry<>(e.getKey(), new ArrayList<>(e.getValue())))
        .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
Map keyMap2=keyMap.entrySet().stream()
.map(e->new AbstractMap.SimpleEntry(e.getKey(),new ArrayList(e.getValue()))
.collect(Collectors.toMap(e->e.getKey(),e->e.getValue());

此代码使用Java 8流和方法引用复制
keyMap

的值列表:

 Map<Integer, List<ObjectA>> keyMap2 = keyMap.entrySet().stream()
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Map keyMap2=keyMap.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue));
或者,如果您想将keyMap中的列表复制到另一个列表,那么

Map<Integer, List<ObjectA>> keyMap2 = keyMap.entrySet().stream()
                    .collect(Collectors.toMap(Map.Entry::getKey, e -> new ArrayList<ObjectA>(e.getValue())));
Map keyMap2=keyMap.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,e->newarraylist(e.getValue()));
keyMap 2=新的HashMap(keyMap);

将HashMap替换为您喜欢或需要的任何映射实现。

keyMap2=新的HashMap(keyMap)
。您好@saka1029,这对我不起作用。我想可能是我的HashMap中包含了一个列表。我为
keyMap
map界面提供了putAll方法,对不对?嗨,这对我不起作用<代码>keyMap2.clear()
keyMap2.putAll(serviceAccountsKeyMap)
keyMap2
值仍然会更改,如果我更改
keyMap
中的值,请稍候,您是否正在更改keyMap的内容或该映射包含的某些对象的属性?在后一种情况下,您仍然存在别名问题…嗨,这对我不起作用<代码>keyMap2.clear()
keyMap2.putAll(serviceAccountsKeyMap)keyMap
 Map<Integer, List<ObjectA>> keyMap2 = keyMap.entrySet().stream()
                    .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Map<Integer, List<ObjectA>> keyMap2 = keyMap.entrySet().stream()
                    .collect(Collectors.toMap(Map.Entry::getKey, e -> new ArrayList<ObjectA>(e.getValue())));
keyMap2 = new HashMap<Integer, List<ObjectA>>(keyMap);