2016-05-05 10 views
0

Im folgenden Beispiel zerstört Garbage Collector ein nutzloses (referenzfreies) Objekt, wenn es als Schlüssel in weakHashMap verwendet wird, was in Ordnung ist. Aber wenn irgendein wertloses Objekt als Wert verwendet wird, dann, warum der Garbage Collector dieses Objekt nicht zerstört.Warum zerstört der Garbage Collector kein Objekt als Wert in WeakHashMap, der keinen Bezug hat?

 public class WeakHashMapDemo { 
    public static void main(String[] args) throws InterruptedException{ 
     WeakHashMap whs=new WeakHashMap(); 
     Temp t=new Temp(); 
     Temp t1=new Temp(); 
     Integer x=new Integer(5); 
     Integer y=6; 
     whs.put(t,"hemant"); 
     whs.put("hemant", t1); 
     whs.put(x,"durga"); 
     whs.put(y,"bacon"); 
     System.out.println(whs); 
     t=null; 
     t1=null; 
     x=null; 
     y=null; 
     System.gc(); 
     Thread.sleep(2000); 
     System.out.println(whs); 
    } 
} 

Temp-Klasse: -

class Temp{ 

    @Override 
    public String toString() { 
     return "temp"; //To change body of generated methods, choose Tools | Templates. 
    } 

    @Override 
    protected void finalize() throws Throwable { 
     System.out.println("finalize() mrthod is called"); 

    } 



} 

Ausgang

{hemant=temp, 6=bacon, 5=durga, temp=hemant} 
    finalize() mrthod is called 
    {hemant=temp, 6=bacon} 

mir Acording ausgegeben werden soll: -

{hemant=temp, 6=bacon, 5=durga, temp=hemant} 
    finalize() mrthod is called 
    {hemant=null} 

Antwort

0

A WeakHashMap als mit schwachen Schlüsseln definiert ist, aber nicht schwach Werte:

Hash-Tabelle basierte Implementierung der Map-Schnittstelle, mit schwachen Schlüssel. Ein Eintrag in einer WeakHashMap wird automatisch entfernt, wenn der Schlüssel nicht mehr verwendet wird.

Wenn ein Verweis auf den Schlüssel vorhanden ist, wird das Schlüssel-Wert-Paar weiterhin in der Karte vorhanden sein.

"Hemant" ist immer noch vorhanden, weil es ein String-Literal ist, also im String-Pool und 6 wird existieren, weil es ein kleines Integer-Literal ist, so dass es im Integer-Pool ist.

Die zugeordneten Objekte zu x und t gibt es nicht, weil sie mit dem new Schlüsselwort erstellt ist, die ein neues Objekt erstellt und dann sind sie auf null gesetzt, auf das Objekt die einzige Referenz zu entfernen.

Da es also immer noch Referenzen auf "Hemant" und 6 gibt, bleiben diese Schlüssel und ihre Werte in der Karte.