我得到了這個代碼片段: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它是不可變的。

FFIVE
TA貢獻1797條經驗 獲得超6個贊
其他方式:
Map<String, Set<String>> map2 = new HashMap<>();
map2.putAll(map);
map2.replaceAll((k, v) -> new HashSet<>(v));
添加回答
舉報
0/150
提交
取消