Java LinkedHashMap最早的条目提供空键、值

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()

在尝试将LinkedHashMap用作LRU缓存时,我遇到了空指针异常。讨论了一个类似的问题,但是我的场景有点不同

@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);