2016-05-05 4 views
0

以下の例では、weakHashMapのキーとして使用されている場合、ガベージコレクタは無駄な(refrence less)オブジェクトを破棄していますが、ガベージコレクタがそのオブジェクトを破棄していない理由として、なぜガベージコレクタはWeakHashMapの値としてオブジェクトを破棄しませんが、これは参照がありません。

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

温度クラス: -

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"); 

    } 



} 

出力

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

出力がなければならない私た内容に応じて: -

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

答えて

0

WeakHashMapが弱いキーではなく、弱い値を有するように定義される:

弱いとMapインタフェースのハッシュテーブルベースの実装を、キー。 WeakHashMapのエントリは、そのキー が通常使用されなくなったときに自動的に削除されます。

キーへの参照がある場合、キーと値のペアは引き続きマップに存在します。

"Hemant"は文字列リテラルなので文字列プールにあり、6は存在します。これは、整数リテラルであるため、整数プールにあります。

xtに割り当てられたオブジェクトは、新しいオブジェクトを作成するnewキーワードで作成されていて、そのオブジェクトへの唯一の参照を削除してnullに設定されているため存在しません。

"Hemant"6への参照がまだあるので、これらのキーとその値はマップに残ります。

関連する問題