2009-06-15 23 views
6

¿Hay utilidad de Java que hace clone() método para HashMap dicha copia que se hace de los elementos del mapa no sólo el objeto de mapa (como el clone() en HashMap clase)?utilidad clon de HashMap en Java

+0

Una nota al margen: si sus elementos son inmutables a través del gráfico de objetos - que no es necesario para clonar ellos. – Fortyrunner

Respuesta

11

¿Qué pasa con otros objetos a los que se hace referencia en los elementos? ¿Qué tan profundo quieres tu clon?

Si los elementos del mapa no tienen ninguna referencia profundas y/o todo es Serializable, puede serializar el mapa a través de ObjectOutputStream en un ByteArrayOutputStream y luego deserializar inmediato.

La única otra alternativa es hacerlo manualmente.

1

Una vez que conozca su clave/valor par son elementos cloneable:

HashMap<Foo, Bar> map1 = populateHashmap(); 
HashMap<Foo, Bar> map2 = new HashMap<Foo, Bar>(); 

Set<Entry<Foo, Bar>> set1 = map1.entrySet(); 
for (Entry<Foo, Bar> e : l) 
    map2.put(e.getKey().clone(), e.getValue().clone()); 
+2

@Oso: ¿Qué sucede si e.getKey() o e.getValue() es otro HashMap() u otro objeto que también requiere un clon de copia profunda? –

+0

bueno ... esta es una simple rutina de clics de hashmap. En realidad, estoy asumiendo que los objetos son clonables, por lo que las profundidades serán resueltas por los objetos clave/valor mismos. Para hacer una clonación profunda de un hashmap sin asumir serializables/clonables, creo que la reflexión sería una forma (aún no estoy seguro si es cierto). – Oso

1

La cuestión de forma clon profundo recomendación utilidad es similar a éste, y tiene an answer that may be helpful to you.

Para resumir, recomiendan usar the Cloning library de Google Code. Por experiencia personal, copia en profundidad HashMap s. Incluso puede clonar cosas que no son Cloneable.

0

A menudo la copia debe ser profunda. Aquí hay un ejemplo de cómo "copia en profundidad"

Map<Integer, ArrayList<Integer>> 

código:

public static Map<Integer, ArrayList<Integer>> deepCopyMapIntList 
     (Map<Integer, ArrayList<Integer>> original) { 

    Map<Integer, ArrayList<Integer>> copy = new HashMap<>(original.size()); 

    for (int i : original.keySet()) { 
     ArrayList<Integer> list = original.get(i); 

     copy.put(i, (ArrayList<Integer>) list.clone()); 
    } 
    return copy; 
}