La méthode hashCode() de la classe Enum est définitive et défini en tant que super.hashCode(), ce qui signifie qu'il renvoie un nombre en fonction de l'adresse de l'instance, qui est un nombre aléatoire à partir de programmeurs POV.
En le définissant par exemple, comme en ordinal() ^ getClass().getName().hashCode()
serait déterministe à travers les différentes machines virtuelles. Il serait même travailler un peu mieux, depuis le moins de bits significatifs allait "changer autant que possible", par exemple, pour une énumération contenant jusqu'à 16 éléments et d'une table de hachage de taille 16, il n'y aurait certainement pas de collisions (bien sûr, à l'aide d'un EnumMap est mieux, mais parfois pas possible, par exemple, il n'y a pas ConcurrentEnumMap). Avec la définition actuelle, vous n'avez aucune garantie, avez-vous?
Résumé des réponses
À l'aide de Object.hashCode()
compare à un meilleur hashCode comme ci-dessus comme suit:
- PROS
- simplicité
- CONTRAS
- vitesse
- plus de collisions (quelle que soit la taille d'une table de hachage)
- le non-déterminisme, qui se propage à d'autres objets, les rendant inutilisables pour
- simulations déterministes
- ETag calcul
- la chasse aux bogues en fonction, par exemple sur un
HashSet
itération de l'ordre
Je serais personnellement préfèrent le plus beau de hashCode, mais à mon humble avis pas de raison de poids beaucoup, peut-être à l'exception de la vitesse.
Mise à JOUR
J'ai été curieux au sujet de la vitesse et a écrit un test avec de surprenants résultats. Pour le prix d'un seul champ par classe, vous pouvez déterministe code de hachage qui est près de quatre fois plus rapide. Stocker le code de hachage dans chaque domaine serait encore plus rapide, bien que de façon négligeable.
L'explication de la norme de code de hachage n'est pas beaucoup plus rapide, c'est qu'il ne peut pas être l'objet d'adresses comme des objets est déplacé par le GC.
Mise à JOUR 2
Il y a des choses étranges se passe avec l' hashCode
de performance en général. Quand je les comprends, il y a toujours la question, pourquoi System.identityHashCode
(lecture à partir de l'objet de l'en-tête) est beaucoup plus lent que l'accès à un objet normal champ.