2016-12-22 4 views
0

Пожалуйста, помогите с этой магией я наблюдаю здесь:гуава кэш магия миссы

Map<String, RenditionMeta> map = cache.asMap(); 
     System.out.println("Before iterating: " + map.containsKey(objectId)); 
     for(String s : map.keySet()) { 
      if(s.equals(objectId)) { 
       System.out.println(s + " equals " + objectId + ":" + s.equals(objectId) + "-" + map.containsKey(objectId)); 

       System.out.println(objectId.hashCode()); 
       System.out.println(s.hashCode()); 
      } 
     } 

выходов:

Before iterating: false 
09009e5d805f6b0b equals 09009e5d805f6b0b:true-false 
1453886923 
1453886923 

Может кто-нибудь объяснить, как «истинно-ложно» можно выше?

кэша определяются как

this.cache = CacheBuilder.newBuilder() 
       .concurrencyLevel(4) 
       .weakKeys() 
       .maximumSize(10000) 
       .expireAfterWrite(10, TimeUnit.MINUTES) 
       .build(); 
+0

Возвращенная Карта не является копией кеша. Это живой вид кеша. Итак, между моментом, когда вы повторяетесь, и когда вы вызываете containsKey(), ключ удаляется из кеша. –

+0

Я думал об этом. См. Добавленную строку. Вопрос: как значение отображалось на карте? – user431529

ответ

2

При использовании слабых ключей опции кэш гуавы использует идентификационное равенство для ключей, следовательно, поведение, которое вы соблюдающими. CacheBuilder#weakKeys