我计划使用Google的缓存实施(com.google.common.cache.Cache
)和java.util.set
。下面是一个代码块,显示使用Set.contains()
检查集合中是否存在元素的结果。
当Set
的元素类型为java.util.Map
时,它实际上会检查传递的地图的key
和Value
是否与找到的任何元素相似在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的缓存实施有更好的了解,我也会感激,如果这是一个已知问题,我会有所了解。
谢谢。
答案 0 :(得分:2)
这是因为HashMap
的{{3}}实现提供了深层次的相等检查,而番石榴equal()
没有提供它从Object使用它的相同方法
答案 1 :(得分:2)
缓存故意使用引用相等,因为不同缓存的相等并不意味着:如果一毫秒后,其中一个条目到期,则缓存不再相等。
如果您希望内容平等,那么有一个简单的解决方法:cache1.asMap().equals(cache2.asMap())
。