Java 将地图复制到另一个新地图
我有两个HashMap,如下所示: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中
@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);