#java #hashmap #soft-references
#java #hashmap #программные ссылки
Вопрос:
Я хотел иметь карту с сопоставлением ключей с довольно большим объектом. Поскольку карта будет использоваться в качестве кэша, я хотел, чтобы значения / записи, на которые ссылаются с помощью программных ссылок ( 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. Я не думаю, что в java есть что-то подобное из коробки, вам нужно реализовать это самостоятельно
Ответ №1:
Да, CacheBuilder от Guava поддерживает как значения SoftReference, так и WeakReference, а также другие политики удаления, основанные на размере и времени. Вы можете использовать кэш напрямую или просматривать его как карту:
ConcurrentMap<Integer, V> map = CacheBuilder.newBuilder()
.softValues()
.build()
.asMap()
Комментарии:
1. отличная альтернатива! Спасибо!