Почему String hashCode () не кеширует 0?

В исходном коде Java 6 для 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.

Итак, мои вопросы:

Почему String 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.

Ответы на вопрос(8)

Ваш ответ на вопрос