L'égalité entre les 2 HashMap
Dans la méthode equals() de ma classe, je suis en utilisant une instance privée HashMap variable à comparer, pour l'égalité. Cependant, les 2 objets différents montrent toujours être égale comparant leurs HashMap variables. D'autres recherches m'ont amené à le lien : Lien Ici . Cependant, il est seulement dit que la raison pour HashMap1.equals(HashMap2) ne fonctionne pas c'est parce que " apparemment, Java les tableaux ne peuvent pas être testés pour l'égalité sans la rédaction d'un code personnalisé."
Je n'ai pas compris cette raison. Quelqu'un peut-il svp me guider pour un élaborer la raison?
Vous devez vous connecter pour publier un commentaire.
La
equals
une méthode Java de type tableau est équivalent à==
, parce que Java tableau "classes" ne remplacent pas lesObject.equals
.Si vous voulez comparer des tableaux "par valeur", vous devez soit utiliser le
java.util.Arrays.equals(...)
méthode, ou de mettre en œuvre vous-même.Si votre
HashHap
utilise des tableaux que des clés ou des valeurs, alors il va appeler la matriceequals
méthode pour tester si les clés et/ou les valeurs sont les mêmes entre les deux cartes. Ce seraitHashMap.equals
comporter bizarrement (à partir de votre point de vue). C'est ce que l'article lié est en train de dire. Cependant, la matrice sémantique seulement affecterHashMap
égalité dans le cas où vous utilisez les tableaux comme la clé ou la valeur des classes. Si vous ne le faites pas, alorsHashMap::equals
devrait fonctionner comme prévu.La javadoc de l'égalité sur
Map
classes sont un peu impliqué, mais en gros, ils se résument à prendre les deux d'entrée de jeux, de comparer leurs tailles, et ensuite de faires1.containsAll(s2)
. Bien sûr, c'est cher, mais il devrait de travail pour tous lesMap
les classes qui implémentent correctement leMap
interface.Noter que l'utilisation de tableaux comme des clés pour les cartes est une mauvaise idée pour deux raisons:
equals
ethashCode
sont mauvais pour unHashMap
dans la plupart des scénarios. Pour la plupart des cas d'utilisation, vous avez besoin de la carte pour comparer les clés de la valeur, non par l'identité de l'objet.equals
/hashcode
problème, vous pouvez encore pause d'une carte invariants par la modification d'un tableau de clés.L'article est juste. Hashmaps peuvent être comparées en toute sécurité à l'aide de la méthode equals() aussi longtemps que les objets clés et objets de valeur sont possible de comparer à l'aide de la même méthode. Dans l'article, les valeurs de la carte sont des tableaux, qui ne sont pas implémenter equals (), comme prévu. À l'aide de liste de tableaux au lieu de cela aurait résolu le problème.
Natif Java les tableaux n'ont pas .equals() de la fonction. Donc, si votre table de hachage de valeurs (ou les touches, je suppose) sont des tableaux, HashMap.equals() échouera. Je soupçonne qu'il faudrait se rabattre sur l'Objet.equals() qui vérifie juste pour voir si les deux objets sont en fait le même objet.
Vous pouvez contourner le problème en utilisant une variante sur un Conteneur, plutôt qu'un tableau[], comme des conteneurs disposent de leur propre .equals() qui appelle equals() sur les éléments successifs de l'contenants plutôt que de simplement vérifier si elles sont de la même référence. Le code pour une Collection.est égal à la mise en œuvre pourrait ressembler à quelque chose comme:
Cela pourrait produire une véritable comparaison de la valeur en fonction de ce que la collecte du contenu n'lorsque vous appelez leurs
equals()
.C'est juste une façon compliquée de dire que Java les tableaux ne remplacent pas les
Object.equals()
. Donc si vous la comparez à l'aide deequals()
(qui est ce que laequals
les méthodes de toutes les classes de collection), vous obtenez une "instance de l'égalité", au lieu de "valeur de l'égalité".C'est juste un cas particulier de l'différentes façons
equals
fonctionne selon qu'il a été substituée ou non.