Реализация HashMap с мягкими ссылочными значениями - PullRequest
0 голосов
/ 18 апреля 2019

Я хотел иметь карту с сопоставлением клавиш для довольно большого объекта. Поскольку карта будет использоваться в качестве кэша, я хотел создать значения / записи, на которые ссылаются программные ссылки (java.lang.ref.SoftReference), чтобы очистить ее в чистой памяти. Но в этом случае мне нужна собственная реализация метода computeIfAbsent().

Я мог бы реализовать это следующим образом:

Map<Integer, SoftReference<T>> myMap = new HashMap<>();

public T get(Integer key) {
    SoftReference<T> value = myMap.get(key);
    if (value == null || value.get() == null) {
        value = new SoftReference(retrieveValue());
        myMap.put(key, value);
    }
    return value.get();
}

Просто хотел знать, есть ли готовое решение для такой Карты, как java.util.WeakHashMap?

Спасибо!

1 Ответ

1 голос
/ 18 апреля 2019

Да, Guava's CacheBuilder поддерживает значения как SoftReference, так и WeakReference, а также другие политики удаления, основанные на размере и времени.Вы можете использовать кэш напрямую или просмотреть его как карту:

ConcurrentMap<Integer, V> map = CacheBuilder.newBuilder()
   .softValues()
   .build()
   .asMap()
...