Saltar al contenido

Cómo copiar HashMap (no copia superficial) en Java

Solución:

Tiene razón en que una copia superficial no cumplirá con sus requisitos. Tendrá copias del Lists de su mapa original, pero esos Lists 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 Lists 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *