为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

尚方宝剑之说 2022-01-19 09:37:45
我得到了这个代码片段: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 完成与地图分开,同时从地图复制所有元素?
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

putAll复制键和值的引用。它不会复制这些引用所引用的实例。


您必须循环(或流式传输)原始Map值并创建所有值的副本Set:


Map<String, Set<String>> map2 =

    map.entrySet()

       .stream()

       .collect(Collectors.toMap(Map.Entry::getKey,e-> new HashSet<>(e.getValue())));

请注意,不需要创建密钥的副本,因为String它是不可变的。


查看完整回答
反对 回复 2022-01-19
?
FFIVE

TA贡献1797条经验 获得超6个赞

其他方式:


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

map2.putAll(map);


map2.replaceAll((k, v) -> new HashSet<>(v));


查看完整回答
反对 回复 2022-01-19
  • 2 回答
  • 0 关注
  • 206 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信