Java LinkedHashMap最早的条目提供空键、值
在尝试将LinkedHashMap用作LRU缓存时,我遇到了空指针异常。讨论了一个类似的问题,但是我的场景有点不同Java LinkedHashMap最早的条目提供空键、值,java,nullpointerexception,linkedhashmap,Java,Nullpointerexception,Linkedhashmap,在尝试将LinkedHashMap用作LRU缓存时,我遇到了空指针异常。讨论了一个类似的问题,但是我的场景有点不同 @Override protected boolean removeEldestEntry(Map.Entry<K, CacheItem<V>> eldest) { if(size() >= maxEntriesOnHeap) { if (eldest.getValue() != null && eldest.getValue()
@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;
}
@覆盖
受保护的布尔重构(Map.Entry最早)
{
如果(size()>=maxEntriesOnHeap)
{
if(eldest.getValue()!=null&&eldest.getValue().isExpired(timeToLiveSecs))
{
offheap.put(eldest.getKey(),eldest.getValue());
}
返回true;
}
返回false;
}
条目对象是包装器对象。我发现,如果我不提供空检查,它会间歇性失败,因为遇到的“最老”条目具有空键和空值。适当的同步已到位
那么,有人知道这样一种情况吗:一个条目可以同时存在两个键,值都为null 在一个简单的测试用例中,这似乎是可行的。也许您可以指出这个测试和您的实现之间的差异
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;
}
}
首先会起作用…这并不是要让您气馁,但是如何使用现有的实现呢?您的问题似乎很广泛。尽量缩短时间,集中精力解决你面临的问题。你可能想提供@sanbhat Okay。。有没有人曾经遇到过这样的场景:使用LinkedHashMap作为LRU映射,并且遇到“最老”条目的键、值为空?这有意义吗?我也会编辑我原来的帖子case@NielsBechNielsen我们正在实现堆外缓存。抱歉,遗漏了该部分。:)
map.put(null, value);