Я профилирую некоторый старый код Java, и кажется, что мое кэширование значений с использованием статического HashMap
и метода доступа не работает.
Кэширующий код (немного абстрактно):
static HashMap<Key, Value> cache = new HashMap<Key, Value>();
public static Value getValue(Key key){
System.out.println("cache size="+ cache.size());
if (cache.containsKey(key)) {
System.out.println("cache hit");
return cache.get(key);
} else {
System.out.println("no cache hit");
Value value = calcValue();
cache.put(key, value);
return value;
}
}
Код профилирования:
for (int i = 0; i < 100; i++)
{
getValue(new Key());
}
Вывод результата:
cache size=0
no cache hit
(..)
cache size=99
no cache hit
Выглядело такстандартная ошибка в хэш-коде Key
или коде равенства.Однако:
new Key().hashcode == new Key().hashcode // TRUE
new Key().equals(new Key()) // TRUE
Что особенно странно, так это то, что cache.put(key, value)
просто добавляет другое значение в хэш-карту вместо замены текущего.
Итак, я не совсем понимаю, что происходитЗдесь.Я что-то не так делаю?
edit Хорошо, я вижу, что в реальном коде Key
используется в других методах и изменениях, которые поэтому отражаются в hashCode
объект в HashMap
.Может ли это быть причиной такого поведения, что оно пропадает без вести?