J'ai remarqué que dans la version 6 de Java code source pour la Chaîne qui hashCode seulement les caches des valeurs autres que 0. La différence de performance est présenté par le fragment de code suivant:
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());
}
}
L'exécution de cette dans ideone.com donne le résultat suivant:
Took 1470 ms.
Took 58 ms.
Donc mes questions sont:
- Pourquoi ne pas la Chaîne de hashCode() cache de 0?
- Quelle est la probabilité qu'un Java chaîne de hachages à 0?
- Quelle est la meilleure façon d'éviter la dégradation des performances de recalculer la valeur de hachage de tous les temps pour les chaînes de hachage à 0?
- Est-ce le meilleur-pratique de la méthode de mise en cache des valeurs? (c'est à dire cache tout sauf un?)
Pour votre amusement, chaque ligne ici est une chaîne de hachage à 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.