¿Por java "putAll" no pueden copiar elementos de valor de profundidad del mapa?

Hind Forsum:

Tengo este fragmento de código:

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
}

De hecho, la modificación de elemento de conjunto map2 afectados de mapa, por lo que el programa imprime "3" en lugar de "2"

Esto es raro, espero que, siempre que he utilizado el método "putAll" para la nueva construcción map2, creo que ambos clave y el valor deben ser profundamente clonados?

Cómo arreglar mi programa y asegurarse de que se ha completado map2 divide desde el mapa, mientras se copian todos los elementos de mapa?

Gracias

Eran :

putAllcopias referencias de las claves y valores. No tiene copias de los casos referenciados por esas referencias.

Vas a tener que bucle (o corriente) sobre el original Mapy crear copias de todo el valor Sets:

Map<String, Set<String>> map2 =
    map.entrySet()
       .stream()
       .collect(Collectors.toMap(Map.Entry::getKey,e-> new HashSet<>(e.getValue())));

Tenga en cuenta que no hay necesidad de crear copias de las llaves, ya que Stringes inmutable.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=223955&siteId=1
Recomendado
Clasificación