亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 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 關注
  • 226 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號