为什么 java "putAll" 不能深度复制 Map 的值元素?

我得到了这个代码片段:


public static void main(String[] args){

    Map<String, Set<String>> map = new HashMap<>();

    Set<String> set = new HashSet<>();

    set.add("user1");

    set.add("user2");

    map.put("key1", set);


    Map<String, Set<String>> map2 = new HashMap<>();

    map2.putAll(map);// I expect all elements are copied


    map.get("key1").add("user3");// add 1 element in "map"

    System.out.println(map2.get("key1").size()); // "map2" was affected

}

实际上map的set元素的修改影响了map2,所以程序打印的是“3”而不是“2”


这很奇怪,我希望,只要我在新的map2构造中使用“putAll”方法,我认为key和value都应该被深度克隆?


如何修复我的程序并确保 map2 完成与地图分开,同时从地图复制所有元素?


尚方宝剑之说
浏览 207回答 2
2回答

SMILET

putAll复制键和值的引用。它不会复制这些引用所引用的实例。您必须循环(或流式传输)原始Map值并创建所有值的副本Set:Map<String, Set<String>> map2 =&nbsp; &nbsp; map.entrySet()&nbsp; &nbsp; &nbsp; &nbsp;.stream()&nbsp; &nbsp; &nbsp; &nbsp;.collect(Collectors.toMap(Map.Entry::getKey,e-> new HashSet<>(e.getValue())));请注意,不需要创建密钥的副本,因为String它是不可变的。

FFIVE

其他方式:Map<String, Set<String>> map2 = new HashMap<>();map2.putAll(map);map2.replaceAll((k, v) -> new HashSet<>(v));
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java