java.util.Map与google缓存实现(com.google.common.cache.Cache)的区别

时间:2014-06-18 17:45:34

标签: java collections guava

我计划使用Google的缓存实施(com.google.common.cache.Cache)和java.util.set。下面是一个代码块,显示使用Set.contains()检查集合中是否存在元素的结果。

Set的元素类型为java.util.Map时,它实际上会检查传递的地图的keyValue是否与找到的任何元素相似在Set。所以我的理解是调用Key和Value对象equals()方法来检查是否有任何元素具有相同的值。

另一方面,谷歌的实施似乎正在使用obj1==obj2类型比较。

    final Map<Integer, Integer> map = new HashMap<>();
    map.put(1,1);
    final Map<Integer, Integer> map2 = new HashMap<>();
    map2.put(1,1);

    Set<Map<Integer, Integer>> s2 = new HashSet<>();
    s2.add(map);
    System.out.println("Set.contains() check with a different instance of java.util.Map but same (key,value)=>(1,1): "+s2.contains(map2));


    final Cache<Integer, Integer> cache = CacheBuilder.newBuilder().expireAfterWrite(10L, TimeUnit.MINUTES).build();
    cache.put(1,1);
    final Cache<Integer, Integer> cache2 = CacheBuilder.newBuilder().expireAfterWrite(10L, TimeUnit.MINUTES).build();
    cache2.put(1,1);

    Set<Cache<Integer,Integer>> s = new HashSet<>();
    s.add(cache);
    System.out.println("Set.contains() check with a different instance of com.google.common.cache.Cache but same (key,value)=>(1,1): "+s.contains(cache2));

以下是上述代码的输出。

Set.contains() check with a different instance of java.util.Map but same (key,value)=>(1,1): true
Set.contains() check with a different instance of com.google.common.cache.Cache but same (key,value)=>(1,1): false

我的问题是:

这是预期的行为还是错误?

或者我在考试中错过了什么?

如果有人对Google的缓存实施有更好的了解,我也会感激,如果这是一个已知问题,我会有所了解。

谢谢。

2 个答案:

答案 0 :(得分:2)

这是因为HashMap的{​​{3}}实现提供了深层次的相等检查,而番石榴equal()没有提供它从Object使用它的相同方法

答案 1 :(得分:2)

缓存故意使用引用相等,因为不同缓存的相等并不意味着:如果一毫秒后,其中一个条目到期,则缓存不再相等。

如果您希望内容平等,那么有一个简单的解决方法:cache1.asMap().equals(cache2.asMap())