LinkedHashMap最老的条目给出null键,值

时间:2014-04-02 09:47:17

标签: java nullpointerexception linkedhashmap

在尝试使用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?

1 个答案:

答案 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);

首先会起作用......