2009-06-15 27 views
6

Esiste l'utilità java che esegue il metodo clone() per HashMap in modo che copi gli elementi della mappa non solo l'oggetto della mappa (come la classe clone() nella classe HashMap)?per HashMap in java

+0

Una nota a margine: se gli elementi sono immutabili in tutto il grafo di oggetti - non è necessario clonare loro. – Fortyrunner

risposta

11

E gli altri oggetti citati negli elementi? Quanto profondo vuoi il tuo clone?

Se i vostri elementi della mappa non hanno alcun riferimento profonde e/o tutto è Serializable, è possibile serializzare mappa Via ObjectOutputStream in un ByteArrayOutputStream e poi deserializzare subito.

L'unica altra alternativa è farlo manualmente.

1

Una volta che conosci la tua coppia elementi chiave/valore sono clonabile:

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: Cosa succede se e.getKey() o e.getValue() è un altro HashMap() o un altro oggetto che richiede anche un clone di copia profonda? –

+0

bene ... questa è una semplice routine clone di hashmap. In realtà suppongo che gli oggetti siano clonabili, quindi le profondità saranno risolte dagli oggetti chiave/valore stessi. Per approfondire un'hashmap senza presupporre serializzabile/clonabile, penso che la riflessione sarebbe un modo (non sono ancora sicuro se vero). – Oso

1

La domanda SO La raccomandazione di utilità clone profonda è simile a questa e ha an answer that may be helpful to you.

Per riepilogare, si consiglia di utilizzare the Cloning library da Google Code. Per esperienza personale, copia in profondità HashMap s. Può anche clonare cose che non sono Cloneable.

0

Spesso la copia deve essere profonda. Ecco un esempio di come "copia completa"

Map<Integer, ArrayList<Integer>> 

codice:

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; 
}