具有软引用值的 HashMap 实现
HashMap implementation with the soft referenced values
我想要一个映射键映射到相当大的对象。
由于地图将用作缓存,我想通过软链接 (java.lang.ref.SoftReference
) 引用 values/entries 以在纯内存上清除它。但在这种情况下,我需要自己实现 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
?
谢谢!
是的,Guava 的 CacheBuilder 支持 SoftReference 和 WeakReference 值,以及其他基于大小和时间的逐出策略。可以直接使用Cache,也可以用Map来查看:
ConcurrentMap<Integer, V> map = CacheBuilder.newBuilder()
.softValues()
.build()
.asMap()
我想要一个映射键映射到相当大的对象。
由于地图将用作缓存,我想通过软链接 (java.lang.ref.SoftReference
) 引用 values/entries 以在纯内存上清除它。但在这种情况下,我需要自己实现 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
?
谢谢!
是的,Guava 的 CacheBuilder 支持 SoftReference 和 WeakReference 值,以及其他基于大小和时间的逐出策略。可以直接使用Cache,也可以用Map来查看:
ConcurrentMap<Integer, V> map = CacheBuilder.newBuilder()
.softValues()
.build()
.asMap()