2013-09-23 10 views
6

Nel seguente esempio di codice quando le chiavi sono impostate su null e System.gc() viene chiamato, lo WeakHashMap perde tutti i mapping e viene svuotato.WeakHashMap vs HashMap

class WeakHashMapExample { 

public static void main(String[] args) { 

    Key k1 = new Key("Hello"); 
    Key k2 = new Key("World"); 
    Key k3 = new Key("Java"); 
    Key k4 = new Key("Programming"); 

    Map<Key, String> wm = new WeakHashMap<Key, String>(); 


    wm.put(k1, "Hello"); 
    wm.put(k2, "World"); 
    wm.put(k3, "Java"); 
    wm.put(k4, "Programming"); 
    k1=null; 
    k2=null; 
    k3=null; 
    k4=null; 
    System.gc(); 
    System.out.println("Weak Hash Map :"+wm.toString()); 

} 

} 

class Key{ 

private String key; 

public Key(String key) { 
    this.key=key; 
} 

@Override 
public boolean equals(Object obj) { 
    return this.key.equals((String)obj); 
} 
@Override 
public int hashCode() { 
    return key.hashCode(); 
} 
@Override 
public String toString() { 
    return key; 
} 

} 

Output: Weak Hash Map :{}

Quando WeakHashMap si usa con HashMap tasti sono impostati nullo, il WeakHashMap non perde le mappature valori-chiave.

class WeakHashMapExample { 

public static void main(String[] args) { 

    Key k1 = new Key("Hello"); 
    Key k2 = new Key("World"); 
    Key k3 = new Key("Java"); 
    Key k4 = new Key("Programming"); 

    Map<Key, String> wm = new WeakHashMap<Key, String>(); 
    Map<Key, String> hm=new HashMap<Key, String>(); 

    wm.put(k1, "Hello"); 
    wm.put(k2, "World"); 
    wm.put(k3, "Java"); 
    wm.put(k4, "Programming"); 

    hm.put(k1, "Hello"); 
    hm.put(k2, "World"); 
    hm.put(k3, "Java"); 
    hm.put(k4, "Programming"); 
    k1=null; 
    k2=null; 
    k3=null; 
    k4=null; 
    System.gc(); 
    System.out.println("Weak Hash Map :"+wm.toString()); 
    System.out.println("Hash Map :"+hm.toString()); 
} 

} 

class Key{ 

private String key; 

public Key(String key) { 
    this.key=key; 
} 

@Override 
public boolean equals(Object obj) { 
    return this.key.equals((String)obj); 
} 
@Override 
public int hashCode() { 
    return key.hashCode(); 
} 
@Override 
public String toString() { 
    return key; 
} 

} 

uscita: Weak Hash Map :{Java=Java, Hello=Hello, World=World, Programming=Programming} Hash Map :{Programming=Programming, World=World, Java=Java, Hello=Hello}

La mia domanda è perché non l'WeakHashMap perdere le sue voci nel secondo esempio di codice anche dopo che le chiavi vengono scartati?

risposta

11

A WeakHashMap elimina le voci quando la chiave non è più raggiungibile dal codice in tempo reale. Poiché lo HashMap mantiene un riferimento rigido ai tasti, i tasti sono ancora raggiungibili e lo WeakHashMap non scarta le voci.

Il punto è che il comportamento ha a che fare con i riferimenti agli oggetti chiave, non con il valore di qualsiasi variabile che potrebbe avere una volta un riferimento alle chiavi.

+0

Non ho mai nemmeno pensato alle variabili come solo contenendo un puntatore, questo è molto istruttivo da sapere, grazie! – xorinzor

2

Un oggetto deve essere eliminato altrove, quindi la WeakHashMap cancella quell'oggetto. Come un WeakReference, il suo scopo è quello di ricordare un oggetto se è ancora in uso. Senza causare perdite di memoria per sempre mantenendo un oggetto.

Nell'esempio impostato hm = null; per vedere la magia della WeakHashMap ripulire.

+0

sì, l'impostazione 'hm = null' prima che 'System.gc()' cancelli il WHM. Grazie, ho capito. – Nishant

3

Hai impostato null su puntatori k1,k2,k3,k4 ma HashMap e WeakHashMap contiene ancora i riferimenti a quelli Keys. E poiché HashMap contiene referenece, le istanze effettive delle Chiavi non vengono cancellate da GC. WeakHashMap stampa ancora tutti loro.

Prova a eseguire questo esempio solo con HashMap -> anche se hai annullato tali riferimenti HashMap li manterrà.

0

HashMap domina gc (garbage collector).

dom domba WeakHashMap.

Anche se abbiamo impostato nulla su K1, K2, K3, K4 gc suole rimuovere dal HashMap dove come gc li toglie e ci fornisce mappa vuota per WeakHashMap da qui il nome WeakHashMap