В исходном коде Java для String я заметил, что hashCode кэширует только значения, отличные от 0. Разница в производительности проявляется в следующем фрагменте:
public class Main{
static void test(String s) {
long start = System.currentTimeMillis();
for (int i = 0; i < 10000000; i++) {
s.hashCode();
}
System.out.format("Took %d ms.%n", System.currentTimeMillis() - start);
}
public static void main(String[] args) {
String z = "Allocator redistricts; strict allocator redistricts strictly.";
test(z);
test(z.toUpperCase());
}
}
Выполнение этого в ideone.com дает следующий результат:
Took 1470 ms.
Took 58 ms.
Итак, мои вопросы:
- Почему не кеш файл hashCode() 0?
- Какова вероятность того, что строка Java хеширует 0?
- Каков наилучший способ избежать снижения производительности при пересчете хеш-значения каждый раз для строк с хешем в 0?
- Это лучший способ кэширования ценностей? (т.е. кэшировать все, кроме одного?)
Для вашего развлечения каждая строка здесь представляет собой строку с хешем до 0:
pollinating sandboxes
amusement & hemophilias
schoolworks = perversive
electrolysissweeteners.net
constitutionalunstableness.net
grinnerslaphappier.org
BLEACHINGFEMININELY.NET
WWW.BUMRACEGOERS.ORG
WWW.RACCOONPRUDENTIALS.NET
Microcomputers: the unredeemed lollipop...
Incentively, my dear, I don't tessellate a derangement.
A person who never yodelled an apology, never preened vocalizing transsexuals.