ハインドForsum:
私はこのコードスニペットを得ました:
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
}
実際には、マップのセット要素被災MAP2の変更、プログラムの代わりに「2」の「3」を出力しますので、
これは、私はそれを期待して、奇妙である限り、私は新しいMAP2の建設のために「のputAll」メソッドを使用して、私は、キーと値の両方が深く複製する必要があると思いますか?
どのように私のプログラムを修正し、マップからすべての要素をコピーしている間に必ずMAP2は、マップから分割完了作るには?
感謝
彼らは次のとおりでした:
putAll
キーと値のコピーを参照。これは、これらの参照が参照するインスタンスのコピーを作成しません。
あなたは、元以上のループ(またはストリーム)にあるでしょうMap
し、すべての値のコピーを作成Set
秒:
Map<String, Set<String>> map2 =
map.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,e-> new HashSet<>(e.getValue())));
以来、キーのコピーを作成する必要は、ありませんことに注意してくださいString
不変です。