なぜJavaの「のputAllは」ディープ地図の価値要素をコピーすることはできませんか?

ハインド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不変です。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=223951&siteId=1