WeakHashMap - какова его цель и как ее правильно использовать - PullRequest
3 голосов
/ 22 июня 2011

Сегодня я нашел это сообщение в блоге , в котором обсуждались случаи использования WeakHashMap в кэше. Он был заинтригован тем фактом, что не значения, а ключи хранятся как слабые ссылки, и когда ссылка больше не существует, вся пара ключ-значение удаляется из WeakHashMap. Следовательно, это может привести к следующему:

WeakHashMap map = new WeakHashMap();
SomeClass myReference1 = .... 
map.put(new Long(10), myReference1);
// do some stuff, but keep the myReference1 variable around!
SomeClass myReference2 = map.get(new Long(10)); // query the cache
if (myReference2 == null) {
    // this is likely to happen because the reference to the first new Long(10) object
    // might have been garbage-collected at this point
}

Мне любопытно, какие сценарии тогда воспользуются классом WeakHashMap?

Ответы [ 3 ]

3 голосов
/ 22 июня 2011

Когда вы хотите прикрепить метаданные к объекту, для которого вы не управляете жизненным циклом.Типичным примером является ClassLoader, хотя следует позаботиться о том, чтобы избежать создания цикла значения> ключа.

1 голос
/ 29 июня 2013

Я запустил пример кода, чтобы понять разницу между HashMap и WeakHashMap, надеюсь, это поможет

        Map hashMap= new HashMap();
        Map weakHashMap = new WeakHashMap();

        String keyHashMap = new String("keyHashMap");
        String keyWeakHashMap = new String("keyWeakHashMap");

        hashMap.put(keyHashMap, "helloHash");
        weakHashMap.put(keyWeakHashMap, "helloWeakHash");
        System.out.println("Before: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap"));

        keyHashMap = null;
        keyWeakHashMap = null;

        System.gc();  

        System.out.println("After: hash map value:"+hashMap.get("keyHashMap")+" and weak hash map value:"+weakHashMap.get("keyWeakHashMap"));

Вывод будет:

Before: hash map value:helloHash and weak hash map value:helloWeakHash
After: hash map value:helloHash and weak hash map value:null
1 голос
/ 22 июня 2011

Существует много вариантов использования, но действительно важным является случай, когда вы хотите что-то набрать с помощью Class. Поддержание строгой ссылки на Class экземпляры может привязать целые загрузчики классов.

Кроме того, Guava имеет гораздо более полный набор конструкций неосновных эталонных карт.

...