我有2个HashMap如下:
@Session
private Map< Integer, List< ObjectA >> keyMap;
@Session
private Map< Integer, List< ObjectA >> keyMap2;
首先,我会在keyMap
中放入一些数据,然后尝试将数据存储在keyMap
内keyMap2
:
keyMap2 = keyMap;
然后,我将编辑keyMap
内的一些数据。但是,keyMap2
中的值会随着keyMap
中的编辑而改变。
据我所知,这是因为keyMap2
仅指向keyMap
指针,所以keyMap
中的任何内容都会发生变化,它会反映在keyMap2
中,因为同一指针。 (如果我错了,请纠正我。)
我希望保留keyMap2
值而不更改keyMap
。除了我循环keyMap
之外的任何想法,并在keyMap2
内放置1比1。
答案 0 :(得分:1)
您可以像这样使用Java 8 Stream进行复制。
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()));
此代码复制keyMap
。
答案 1 :(得分:0)
已编辑:正如评论中所述,由于通过引用复制包含的列表,原始方法无法正常工作。
如果使用Java8流的方法不起作用,则另一种可能性是迭代Map:
for (keyMap.Entry<Integer, List<ObjectA>> entry : map.entrySet()) {
//Code
}
然后,您可以使用entry.getKey()
将内容复制到keyMap2中,并使用entry.getValue()
如果浅拷贝(通过引用复制ObjectA)是必需的new ArrayList<ObjectA>(entry.getValue())
应该工作,但对于深拷贝(需要ObjectA的新实例),需要有关该对象的更多信息。 / p>
原件:
您需要完整复制散列图。
中实质上private Map< Integer, List< ObjectA >> keyMap2 = new HashMap< Integer, List< ObjectA >>(keyMap);
或者keyMap2.addAll(keyMap);
答案 2 :(得分:0)
您遇到的问题称为别名。
为了打破你的情况,你必须:
clone
ObjectA
方法
keySet
,因此:
List
实例这样,您从头开始创建一个新列表和一组完整的元素,这些元素在内容方面与原始元素相同,但在内存中不是相同的对象。
答案 3 :(得分:0)
正如您所正确提到的,keyMap2
指向与keyMap
相同的HashMap
但如果你这样做:
keyMap2 = (HashMap<String, String>) keyMap.clone();
这会将keyMap
和点keyMap2
复制到该副本。对keyMap
的任何更改都不会反映在副本中
这将解决您的问题
答案 4 :(得分:0)
在Java中没有像指针这样的东西。使用(使用C \ C ++),因此您的更改不会反映出来。您可以使用:
keyMap2 = (HashMap<String, String>) keyMap.clone();
或者:
keyMap.putAll(keyMap2) //This will add all the keys in "keymap" to "keymap2"
//Source: http://docs.oracle.com/javase/7/docs/api/java/util/Map.html
同样,更改不会反映,因为Java中没有pointers
。
干杯。
答案 5 :(得分:0)
使用Java 8 Stream和方法参考:
Map<Integer, List<ObjectA>> keyMap2 = keyMap.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
或者,如果您想将keyMap中的List复制到另一个列表,那么
Map<Integer, List<ObjectA>> keyMap2 = keyMap.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> new ArrayList<ObjectA>(e.getValue())));
答案 6 :(得分:0)
keyMap2 = new HashMap<Integer, List<ObjectA>>(keyMap);
将HashMap替换为您喜欢或需要的任何Map实现。