Solución:
Tiene razón en que una copia superficial no cumplirá con sus requisitos. Tendrá copias del List
s de su mapa original, pero esos List
s se referirá al mismo List
objetos, de modo que una modificación a un List
de uno HashMap
aparecerá en el correspondiente List
del otro HashMap
.
No se proporciona copia profunda para un HashMap
en Java, por lo que aún tendrá que recorrer todas las entradas y put
ellos en el nuevo HashMap
. Pero también debe hacer una copia del List
cada vez también. Algo como esto:
public static HashMap<Integer, List<MySpecialClass>> copy(
HashMap<Integer, List<MySpecialClass>> original)
{
HashMap<Integer, List<MySpecialClass>> copy = new HashMap<Integer, List<MySpecialClass>>();
for (Map.Entry<Integer, List<MySpecialClass>> entry : original.entrySet())
{
copy.put(entry.getKey(),
// Or whatever List implementation you'd like here.
new ArrayList<MySpecialClass>(entry.getValue()));
}
return copy;
}
Si desea modificar su MySpecialClass
objetos, y que los cambios no se reflejen en el List
s de tu copia HashMap
, entonces también necesitará hacer nuevas copias de ellos.
Desafortunadamente, esto necesita iteración. Pero es bastante trivial con las transmisiones de Java 8:
mapCopy = map.entrySet().stream()
.collect(Collectors.toMap(e -> e.getKey(), e -> List.copyOf(e.getValue())))
Serializar a json y deserializar después:
Map<String, Object> originalMap = new HashMap<>();
String json = new Gson().toJson(originalMap);
Map<String, Object> mapCopy = new Gson().fromJson(
json, new TypeToken<Map<String, Object>>() {}.getType());
Para clases especiales, es posible que deba escribir un deserializador personalizado.