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

时间:2015-06-19 06:30:04

标签: java pointers hashmap

我有2个HashMap如下:

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

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

首先,我会在keyMap中放入一些数据,然后尝试将数据存储在keyMapkeyMap2

keyMap2 = keyMap;

然后,我将编辑keyMap内的一些数据。但是,keyMap2中的值会随着keyMap中的编辑而改变。

据我所知,这是因为keyMap2仅指向keyMap指针,所以keyMap中的任何内容都会发生变化,它会反映在keyMap2中,因为同一指针。 (如果我错了,请纠正我。)

我希望保留keyMap2值而不更改keyMap。除了我循环keyMap之外的任何想法,并在keyMap2内放置1比1。

7 个答案:

答案 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>

原件:

您需要完整复制散列图。

这包含在:copying a java hashmap

实质上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实现。