Question

Il apparaît dans java.lang.String.java, que Java ne génère le hashcode, puis le stocker, après un appel à hashcode (), mais pourquoi ne pas simplement faire le hashcode dans le constructeur?

Le code correspondant:

if (h == 0 && count > 0) {
    int off = offset;
    char val[] = value;
    int len = count;

    for (int i = 0; i < len; i++) {
        h = 31*h + val[off++];
    }

    hash = h;
}

pourrait, pour la plupart être placé dans le constructeur.

Était-ce utile?

La solution

Pourquoi passer du temps à générer un code de hachage qui très probablement ne sera pas utilisé? La plupart des chaînes sont construites, utilisées et les déchets collectés sans hashcode () jamais appelé.

Autres conseils

Joshua Bloch appelle cette pratique « racé unique contrôle ».

Jeremy Manson a une excellente explication des raisons pour lesquelles il est fait et pourquoi it'safe: sur son blog

En substance, au moment de la construction vous faire économiser du temps en sautant le calcul du code de hachage. Dans l'environnement multithread vous allez payer pour ce retour parce que multifilet pourrait faire le même calcul.

Ce n'est pas vraiment le bon forum pour cela et la question sera probablement fermée. Vous pouvez demander à programmers.stackexchange.com.

L'une des raisons pourrait être que l'informatique n'est pas hashCode pas cher et il est nécessaire que dans certains cas.

2 raisons:

1) Informatique hashCode() est pas pas cher. Est une complexité de O(n) sur la longueur de la chaîne, afin de mieux le faire que si besoin il

et

2) instances de cordes sont immuables: Puisqu'ils ne changent jamais, vous avez toujours Compute hashCode() au plus une fois

.

Il n'y a aucun avantage lors du placement dans le constructeur. Mais il y a un inconvénient quand il serait dans le constructeur. Lorsque hashCode pour une chaîne est jamais appelée alors le calcul a été fait pour rien. Et lorsque vous appelez hashCode (), il est calculé une fois dans les deux cas -. Juste à différents endroits et de temps

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top