Реализация Java SoftHashMap - PullRequest
       19

Реализация Java SoftHashMap

0 голосов
/ 31 июля 2011

Я хотел реализовать SoftHashMap на основе Java SoftReference и HashMap. Документы Java о WeakHashMap говорят, что ключи являются слабыми ссылками, а не значениями. Мне было интересно, что hashcode() будет использоваться для функций put и pull базового HashMap. Я предполагаю, что WeakHashMap put работает следующим образом: hashMap.put(new WeakReference(key), value); Если это правда, как найти запись для ключа.

Не было бы лучше, если бы значения были заключены в WeakReference, а не в ключи?

1 Ответ

3 голосов
/ 31 июля 2011

Если вы посмотрите на эту статью IBM , вы увидите, что в возможной реализации, которую они дают:

public class WeakHashMap<K,V> implements Map<K,V> {

private static class Entry<K,V> extends WeakReference<K> 
  implements Map.Entry<K,V> {
    private V value;
    private final int hash;
    private Entry<K,V> next;
    ...
}

public V get(Object key) {
    int hash = getHash(key);
    Entry<K,V> e = getChain(hash);
    while (e != null) {
        K eKey= e.get();
        if (e.hash == hash && (key == eKey || key.equals(eKey)))
            return e.value;
        e = e.next;
    }
    return null;
}

put обычно добавляет Entry, но Entry является WeakReferenceссылаясь на объект Key.Если ключ является сборщиком мусора, запись будет в конечном итоге очищена методом expungeStaleEntries () WeakHashMap, который часто вызывается из других операций WeakHashMap.

...