Double dans HashMap
Je pensais de l'aide d'un Double de la clé d'une table de hachage, mais je sais à virgule flottante comparaisons sont dangereux, qui m'a fait réfléchir. Est la méthode equals sur la Double classe aussi dangereuse? Si c'est cela signifierait la méthode hashCode est probablement erroné. Cela signifie que l'utilisation de Double aussi la clé d'une table de hachage conduirait à un comportement imprévisible.
Quelqu'un peut confirmer mes spéculation ici?
source d'informationauteur anio
Vous devez vous connecter pour publier un commentaire.
Réponse courte: Ne pas le faire
Réponse longue: Ici est de savoir comment la clé va être calculée:
La clé sera un
java.lang.Double
objet, depuis les touches doivent être des objets. Voici sonhashCode()
méthode:La
doubleToLongBits()
méthode prend les 8 octets et de les représenter en tant que long. Donc, cela signifie que de petits changements dans le calcul de double peut dire beaucoup de choses et vous aurez la clé de justesse.Si vous pouvez vous contenter d'un nombre donné de points après le point - multiplier par 10^(nombre de chiffres après la virgule) et le convertir en int (par exemple - pour 2 chiffres multipliez par 100).
Il sera beaucoup plus sûr.
Je pense que vous avez raison. Bien que le hachage de l'doubles sont entiers, la double pourrait gâcher le hachage. C'est pourquoi, comme Josh Bloch mentionne dans l'efficacité de la Java, lorsque vous utilisez une double entrée d'une fonction de hachage, vous devez utiliser doubleToLongBits(). De même, l'utilisation floatToIntBits pour des flotteurs.
En particulier, l'utilisation d'un double de votre hash, à la suite de Josh Bloch de la recette, vous feriez:
C'est à partir de l'Article 8 de l'Effectif de Java, "Toujours remplacer hashCode lorsque vous remplacez égale". Il peut être trouvé dans ce pdf du chapitre du livre.
Espère que cette aide.
Cela dépend de comment vous pourriez être en utilisant.
Si vous êtes heureux avec seulement être en mesure de trouver la valeur fondée sur le exactement la même séquence de bits (ou potentiellement un équivalent, tel que +/- 0 et divers NaNs), alors il pourrait être acceptable.
En particulier, tous les NaNs finirait par être considérés comme égaux, mais +0 et -0 serait considéré comme différent. À partir de la documentation pour
Double.equals
:Plus probable que vous êtes intéressé à "des chiffres très proches de la touche" cependant, ce qui rend beaucoup moins viable. En particulier si vous allez faire une série de calculs pour obtenir la clé une fois, puis une autre série de calculs pour obtenir la clé de la deuxième fois, vous aurez des problèmes.
Le problème n'est pas le code de hachage, mais aussi la précision de la double. Ce sera la cause de certains des résultats étranges. Exemple:
La valeur calculée (clé) est "433.29999999999995" qui n'est pas ÉGAL à 433.3 et si vous ne trouvez pas l'entrée dans la Carte (le code de hachage est sans doute aussi différents, mais ce n'est pas le problème principal).
Si vous utilisez
il doit trouver l'entrée...
[]]
Réponse courte: Il ne sera probablement pas travailler.
Réponse honnête: tout dépend.
Plus réponse: Le code de hachage n'est pas la question, c'est la nature de l'égalité des comparaisons sur les calculs en virgule flottante. Comme Nalandial et commentateurs sur son point poste, en fin de compte un match contre une table de hachage finit toujours par à l'aide est égal à choisir la bonne valeur.
Donc la question est, sont vos doubles générée de telle sorte que vous savez qui est égal signifie vraiment, c'est égal? Si vous lisez ou calculer une valeur, de le stocker dans la table de hachage, et puis plus tard, lire ou calculer la valeur en utilisant exactement le même calcul, puis Double.est égal à fonctionner. Mais sinon c'est pas fiable: 1.2 + 2.3 n'est pas nécessairement égal à 3,5, il pourrait l'égalité des 3.4999995 ou quoi que ce soit. (Pas vraiment un exemple, je viens de l'inventer, mais c'est le genre de chose qui se passe.) Vous pouvez comparer des flotteurs et des doubles raisonnablement fiable pour moins ou plus, mais pas égaux.
Peut-être BigDecimal de vous rendre où vous voulez aller?
Le hachage de la double est utilisé, pas le double de lui-même.
Edit: Merci, Jon, en fait, je ne le savais pas.
Je ne suis pas sûr à ce sujet (vous devez simplement regarder le code source de la Double objet) mais je pense que tous les problèmes avec virgule flottante comparaisons seraient pris en charge pour vous.
Il dépend de la façon dont vous stockez et accédez à vous de la carte, oui des valeurs similaires pourrait être légèrement différente et, par conséquent, pas de hachage à la même valeur.
serait une bonne chose, cependant
serait dangereux