почему сборщик мусора не уничтожает какой-либо объект как значение в WeakHashMap, у которого нет ссылки?

В приведенном ниже примере сборщик мусора уничтожает бесполезный (без ссылок) объект, если он используется в качестве ключа в 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}  

person Hemant Dhanuka    schedule 05.05.2016    source источник


Ответы (1)


WeakHashMap определяется как имеющий слабые ключи, но не слабые значения:

Реализация интерфейса карты на основе хеш-таблицы со слабыми ключами. Запись в WeakHashMap будет автоматически удалена, когда ее ключ больше не используется в обычном режиме.

Если есть какая-либо ссылка на ключ, то пара ключ-значение будет продолжать существовать в карте.

"Hemant" все еще существует, потому что это строковый литерал, поэтому в пуле строк, а 6 будет существовать, потому что это небольшой целочисленный литерал, поэтому он находится в пуле целых чисел.

Объекты, присвоенные x и t, не существуют, потому что они созданы с помощью ключевого слова new, которое создает новый объект, а затем им присваивается значение null, удаляя единственную ссылку на этот объект.

Так как все еще есть ссылки на "Hemant" и 6, эти ключи и их значения останутся на карте.

person fgb    schedule 05.05.2016