在尝试使用LinkedHashMap作为LRU缓存时,我面临空指针异常。讨论了类似的问题here,但我的情况有点不同。
@Override
protected boolean removeEldestEntry(Map.Entry<K, CacheItem<V>> eldest)
{
if(size() >= maxEntriesOnHeap)
{
if (eldest.getValue() != null && eldest.getValue().isExpired(timeToLiveSecs))
{
offheap.put(eldest.getKey(), eldest.getValue());
}
return true;
}
return false;
}
条目对象是包装器对象。我发现如果我不提供空检查,它会间歇性地与最老的&#39;条目遇到null键和null值。正确的同步已经到位。
那么,是否有人知道某个条目可以同时存在两个键,值为null?
答案 0 :(得分:0)
在一个简单的测试案例中,这似乎有效。也许你可以指出这个测试和你的实现之间的差异?
import java.util.LinkedHashMap;
import java.util.Map;
public class LinkedHashCacheTest
{
public static void main(String[] args)
{
Map<String, CacheItem<Integer>> map = create();
map.put("K0", new CacheItem<Integer>(0));
map.put("K1", new CacheItem<Integer>(1));
map.put("K2", new CacheItem<Integer>(2));
map.put("K3", new CacheItem<Integer>(3));
map.put("K4", new CacheItem<Integer>(4));
map.put("K5", new CacheItem<Integer>(5));
}
static class CacheItem<V>
{
V v;
CacheItem(V v)
{
this.v = v;
}
public boolean isExpired(double timeToLiveSecs)
{
return false;
}
@Override
public String toString()
{
return String.valueOf(v);
}
}
static <K, V> Map<K, CacheItem<V>> create()
{
Map<K, CacheItem<V>> map = new LinkedHashMap<K, CacheItem<V>>()
{
@Override
protected boolean removeEldestEntry(Map.Entry<K, CacheItem<V>> eldest)
{
int maxEntriesOnHeap = 5;
double timeToLiveSecs = 2;
if(size() >= maxEntriesOnHeap)
{
System.out.println("Removing : "+eldest.getKey()+", "+eldest.getValue());
if (eldest.getValue().isExpired(timeToLiveSecs))
{
System.out.println("To off-heap: "+eldest.getKey()+", "+eldest.getValue());
//offheap.put(eldest.getKey(), eldest.getValue());
}
return true;
}
return false;
}
};
return map;
}
}
无论如何,这个问题可能听起来很幼稚,但是......你确定没有使用null
个密钥吗?像
map.put(null, value);
首先会起作用......