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
putAll
copias 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 Map
y crear copias de todo el valor Set
s:
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 String
es inmutable.