Pourquoi faire j'ai besoin de remplacer la equals et hashCode méthodes en Java?
Récemment, j'ai lu à travers ce
Développeur Travaille Document.
Le document est tout au sujet de la définition de hashCode()
et equals()
efficacement et correctement, mais je ne suis pas en mesure de comprendre pourquoi nous avons besoin de remplacer ces deux méthodes.
Comment puis-je prendre la décision de mettre en œuvre ces méthodes de manière efficace?
- Il y a deux grands articles à la programmation.guide expliquant exactement ceci: Quand dois-je remplacer égaux? et Pourquoi vous devez toujours remplacer hashCode lors de la substitution égal à. (Attention, l'on a accepté la réponse est en fait mal.)
- Cas Remplacer seulement est égal à: deux sur le même objet aura différents hashcode = même des objets d'aller dans les différents seau(duplication). Cas Remplacer seulement hashcode:deux sur le même objet aura le même hashcode = objet même aller dans le même seau(duplication).
Vous devez vous connecter pour publier un commentaire.
Joshua Bloch dit sur l'efficacité de l'Java
Essayons de comprendre avec un exemple de ce qui pourrait arriver si nous remplacer
equals()
sans écraserhashCode()
et tentative d'utilisation d'unMap
.Dire que nous avons une classe de ce genre et que les deux objets de
MyClass
sont égales si leursimportantField
est égal (avechashCode()
etequals()
généré par eclipse)Remplacer seulement
equals
Si seulement
equals
est surchargé, puis quand vous appelezmyMap.put(first,someValue)
premier sera de hachage pour seau et lorsque vous appelezmyMap.put(second,someOtherValue)
il va de hachage à un autre seau (car ils ont un autrehashCode
). Donc, même s'ils sont égaux, car ils ne font pas de hachage pour le même seau, la carte ne peut pas la réaliser et à la fois de leur séjour à la carte.Bien qu'il n'est pas nécessaire de remplacer
equals()
si nous remplacerhashCode()
, nous allons voir ce qui allait se passer dans ce cas particulier où l'on sait que les deux objets deMyClass
sont égales si leursimportantField
est égal, mais nous ne remplacent pas lesequals()
.Remplacer seulement
hashCode
Imaginez que vous avez ce
Si vous remplacez uniquement
hashCode
puis quand vous appelezmyMap.put(first,someValue)
il prend tout d'abord, calcule seshashCode
et les stocke dans un seau. Ensuite, lorsque vous appelezmyMap.put(second,someOtherValue)
il doit remplacer la première avec la seconde que par la Carte De La Documentation parce qu'ils sont égaux (selon les exigences de l'entreprise).Mais le problème est que est égal n'a pas été redéfini, de sorte que lorsque la carte hachages
second
et parcourt le seau en regardant si il y a un objetk
tels quesecond.equals(k)
est vrai qu'elle ne trouverez pas quesecond.equals(first)
serafalse
.Espère que c'était clair
MyClass
n'a pas été respecté -java.lang.AssertionError: Subclass: object is not equal to an instance of a trivial subclass with equal fields
.if you think you need to override one, then you need to override both of them
est faux. Vous avez besoin de remplacerhashCode
si votre classe substitueequals
mais l'inverse n'est pas vrai.myMap.put(second,someOtherValue)
il devrait remplacerfirst
avecsecond
". Pourquoi est-ce? Si vous ne l'emportent sur leshashCode
cela signifie que vous avez hérité deequals
deObject
auquel casfirst
sera pas de l'égalitésecond
. Il semble que vous avez mal compris quelque chose ici.equals
serait une violation du contrat énoncées dans la javadoc deObject
: "Si deux objets sont égaux selon leequals(Object)
méthode, puis en appelant lahashCode
méthode sur chacun des deux objets doit produire le même résultat sous forme d'entier." bien Sûr, pas toutes les parties de tous les contrats sont exercées dans tout le code, mais encore, formellement parlant, c'est une violation et que j'avais un bug en attente de se produire.Integer
clé. Que faire si je n'ai pas remplacer l'un de ces deux méthodes à tous. Est-ce bon?Collections telles que
HashMap
etHashSet
utiliser un hashcode valeur d'un objet afin de déterminer comment il doit être entreposé à l'intérieur d'une collection, et la hashcode est de nouveau utilisé pour localiser l'objetdans sa collection.
De hachage de récupération est un processus en deux étapes:
hashCode()
)equals()
)Voici un petit exemple de raisons pour lesquelles nous devrions overrride
equals()
ethashcode()
.Envisager une
Employee
classe qui a deux champs: l'âge et le nom.Maintenant créer une classe, insérer
Employee
objet dans unHashSet
et de tester si l'objet est présent ou pas.Il permet d'imprimer les éléments suivants:
Maintenant décommentez
hashcode()
méthode , exécuter la même et le résultat serait:Maintenant, pouvez-vous voir pourquoi, si deux objets sont égaux, leurs hashcodes doivent
également être égaux? Sinon, vous ne seriez jamais capable de trouver l'objet dans la mesure où la valeur par défaut
hashcode méthode dans la classe de l'Objet pratiquement toujours avec un numéro unique
pour chaque objet, même si le
equals()
méthode est substituée une manière telle que les deuxobjets ou plus sont considérées comme égales. Il n'a pas d'importance comment égale les objets sont si
leur hashcodes ne reflètent pas que. Donc, une fois de plus: Si deux objets sont égaux, leur
hashcodes doivent être identiques.
Par définition
equals()
ethashCode()
de manière cohérente, vous pouvez améliorer la convivialité de vos classes comme des clés dans la base de hachage collections. Comme la doc API pour hashCode explique: "Cette méthode est prise en charge pour le bénéfice des tables de hachage, tels que ceux fournis parjava.util.Hashtable
."La meilleure réponse à votre question sur la façon de mettre en œuvre ces méthodes de manière efficace vous propose de lire le Chapitre 3 de Efficace Java.
hashCode()
.Tout simplement, l'égalité de la méthode dans l'Objet de vérifier la référence de l'égalité, où deux instances de votre classe pourrait encore être sémantiquement équivalents lorsque les propriétés sont égaux. C'est par exemple important lors de la mise de vos objets dans un récipient qui utilise equals et hashcode, comme HashMap et Ensemble. Disons que nous avons une classe comme:
Nous devons créer deux instances de la même id:
Sans écraser égal à égal, nous obtenons:
Correct? Eh bien peut-être, si c'est ce que vous voulez. Mais disons que nous voulons objets avec le même id pour le même objet, qu'il s'agisse de deux instances différentes. Nous remplacer la equals (et hashcode):
Que pour la mise en œuvre de equals et hashcode je peux vous recommandons d'utiliser Goyave l'aide de méthodes
Identité n'est pas l'égalité.
==
test d'identité.equals(Object obj)
méthode compare test d'égalité(c'est à dire, nous devons dire à l'égalité par la substitution de la méthode)Nous devons d'abord comprendre l'utilisation de la méthode equals.
En vue d'identifier les différences entre deux objets, nous avons besoin de remplacer méthode equals.
Par exemple:
Maintenant la méthode hashCode peuvent comprendre facilement.
hashCode produit entier afin de stocker l'objet dans des structures de données comme HashMap, HashSet.
Supposons que nous disposons de remplacer méthode equals de
Customer
comme ci-dessus,Tout en travaillant avec la structure de données lorsque nous stocker des objets dans des seaux(seau est un nom de fantaisie pour un dossier). Si nous utilisez la fonction de hachage technique, pour au-dessus de deux clients, il génère deux hashcode. Nous sommes donc de stocker le même objet dans deux endroits différents. Pour éviter ce genre de questions, il faut surcharger la méthode hashCode également basée sur les principes suivants.
Ok, Laissez-moi vous expliquer le concept dans des mots très simples.
Tout d'abord dans une perspective plus large, nous avons des collections,et hashmap est l'un des discbased dans les collections.
Pour comprendre pourquoi, nous devons remplacer les deux equals et hashcode méthode, si besoin en premier lieu de comprendre qu'est-ce que hashmap et ce qui est fait.
Une table de hachage est une discbased qui stocke des paires clé-valeur de données dans la matrice de la mode. Disons une[], dans laquelle chaque élément 'a' est une valeur clé de la paire.
Également chaque indice dans le tableau ci-dessus peuvent être liés liste et ainsi avoir plus d'une valeurs de l'indice.
Maintenant, pourquoi est une table de hachage utilisé?
Si nous avons à chercher parmi un large éventail ensuite la recherche par le biais de chaque si eux ne sera pas efficace, donc ce hachage technique nous dit qui vous permet de pré processus de la matrice avec un peu de logique et de regrouper les éléments basés sur la logique, c'est à dire de Hachage
par exemple: nous avons de la matrice de 1,2,3,4,5,6,7,8,9,10,11 et on applique une fonction de hachage mod 10 1,11 seront regroupés ensemble. Donc, si nous avons dû chercher pour 11 dans le tableau précédent nous aurions alors l'itération à l'ensemble de la gamme, mais quand nous sommes en groupe, il nous limitons notre champ d'itération améliorant ainsi la vitesse. Que discbased permet de stocker toutes les informations ci-dessus peut être considéré comme un tableau 2d pour des raisons de simplicité
Maintenant, mis à part la table de hachage dit aussi qu'il l'habitude d'ajouter de tout Doublons. Et c'est la principale raison pour laquelle nous devons remplacer la equals et hashcode
Alors, quand sa dit que d'expliquer le fonctionnement interne de table de hachage , nous avons besoin de trouver quelles sont les méthodes de la table de hachage est et comment faut-il suivre les règles ci-dessus lequel je l'ai expliqué ci-dessus
si la table de hachage a la méthode appelée à mettre(K,V) , et selon hashmap il devrait suivre les règles ci-dessus de manière efficace la distribution de la matrice et de ne pas ajouter tous les doublons
si ce n'est qu'il sera tout d'abord générer le hashcode de la clé donnée à décider lequel l'indice de la valeur devrait aller.si rien n'est présent à l'index alors la nouvelle valeur sera ajoutée au-dessus de là, si quelque chose est déjà présente là-bas puis la nouvelle valeur doit être ajoutée après la fin de la liste liée à l'index. mais n'oubliez pas que les doublons doivent être ajoutés par le comportement souhaité de la table de hachage. donc, disons que vous avez deux Entiers objets aa=11,b=11.
comme tous les objets dérivés de la classe de l'objet, la valeur par défaut de mise en œuvre pour la comparaison de deux objets, c'est qu'il compare la référence et non pas les valeurs à l'intérieur de l'objet. Ainsi, dans le cas ci-dessus, tant bien que sémantiquement l'égalité va échouer le test d'égalité, et de la possibilité que les deux objets qui même hashcode et les mêmes valeurs existe ainsi de créer des doublons. Si nous remplacer, puis nous avons pu éviter l'ajout de doublons.
Vous pouvez aussi consulter Détail de travail
hashCode()
:Si vous remplacez uniquement hash-code de la méthode ne se passera rien. Parce qu'elle a toujours return new
hashCode
pour chaque objet comme un Objet de la classe.equals()
:Si vous remplacez uniquement l'égalité de méthode,
a.equals(b)
est vrai, cela signifie que lehashCode
de a et de b doit être la même, mais pas à arriver. Parce que vous ne pas écraser leshashCode
méthode.Remarque :
hashCode()
méthode de la classe Object toujours return newhashCode
pour chaque objet.Lorsque vous avez besoin d'utiliser votre objet dans la collection en fonction de hachage, doit remplacer les deux
equals()
ethashCode()
.Java met une règle qui
Donc, si dans notre classe, nous allons remplacer
equals()
nous devrions remplacerhashcode()
méthode à suivre cette règle.Les deux méthodes,
equals()
ethashcode()
, sont utilisés dansHashtable
, par exemple, pour stocker des valeurs sous forme de paires clé-valeur. Si nous remplacer l'un et pas l'autre, il y a une possibilité que leHashtable
peut ne fonctionne pas comme nous le voulons, si nous utilisons un objet comme une touche.Parce que si vous ne remplacent pas, vous pourrez utiliser la valeur par défaut implémentation de l'Objet.
Étant donné que l'instance de l'égalité et de hascode des valeurs en général nécessitent la connaissance de ce qui rend un objet généralement, ils devront être redéfinies dans votre classe ont aucun sens en termes concrets.
Afin d'utiliser notre propre classe des objets comme des clés dans des collections comme la table de hachage, Hashtable, etc.. , nous devons remplacer les deux méthodes ( hashCode() et equals() ) par la présence d'une prise de conscience sur le travail interne de la collecte. Sinon, elle conduit à de mauvais résultats dont nous ne sommes pas attendus.
L'ajout de @Lombo 's réponse
Quand vous avez besoin de redéfinir equals() ?
L'implémentation par défaut de l'Objet est égale à() est
qui signifie que les deux objets seront considérés comme égaux que s'ils ont la même adresse mémoire qui n'est vrai que si vous êtes
la comparaison d'un objet avec lui-même.
Mais vous pourriez envisager de deux objets de même s'ils ont la même valeur pour un
ou plus de leurs propriétés (Voir l'exemple donné dans @Lombo 's réponse).
Afin de vous remplacer
equals()
dans ces situations et vous donnez à vos propres conditions de l'égalité.J'ai mis en œuvre avec succès equals() et c'est génial de travailler.Alors, pourquoi sont-ils en demandant de remplacer hashCode() aussi?
Bien.Tant que vous n'utilisez pas "Hash" les Collections sur votre classe définie par l'utilisateur,il est très bien.
Mais, dans l'avenir, vous souhaitez utiliser
HashMap
ouHashSet
et si vous n'avez pasoverride
et "une mise en œuvre correcte" hashCode(), ces Hachage en fonction de la collection ne fonctionne pas comme prévu.Remplacer seulement equals (Plus de @Lombo 's réponse)
Tout d'abord,HashMap vérifie si le hashCode de
second
est le même quefirst
.Seulement si les valeurs sont les mêmes,il va procéder à la vérification de l'égalité dans le même seau.
Mais ici, le hashCode est différente pour ces 2 objets (parce qu'ils ont de différent de l'adresse de mémoire-de la mise en œuvre par défaut).
Par conséquent, il ne sera même pas le soin de vérifier l'égalité.
Si vous avez un point à l'intérieur de votre substituée méthode equals (), il ne serait pas si ils ont des hashCodes.
contains()
vérifiehashCode()
et seulement si, ils sont les mêmes, il ferait appel à votreequals()
méthode.Pourquoi ne pouvons-nous pas faire la table de hachage pour vérifier l'égalité dans tous les compartiments? Donc, il n'est pas nécessaire pour moi de remplacer hashCode() !!
Alors que vous êtes absent le point de Hachage en fonction des Collections.
Considérez les points suivants :
Les éléments suivants sont les clés stockées sous la forme de seaux.
Dire,vous voulez savoir si la carte contient la clé de 10.
Souhaitez-vous souhaitez rechercher tous les seaux? ou voulez-vous rechercher un seul seau?
Basé sur le hashCode,vous permettrait d'identifier que si 10 est présent,il doit être présent dans le Seau de 1.
Si seulement Seau 1 sera recherché !!
hashCode()
pour déterminer laseau et utilise
equals()
méthode pour rechercher si la valeur est déjàprésent dans le Seau. Si non, il sera ajouté sinon, il sera remplacé par la valeur courante
hashCode()
pour trouver l'Entrée (seau) en premier etequals()
pour trouver la valeur en Entréesi les Deux sont remplacées,
Map<Un>
si equals n'est pas substituée
Map<Un>
Si hashCode n'est pas substituée
Map<Un>
HashCode L'Égalité De Contrat
Envisager collection de boules dans un seau tout en couleur noir. Votre Tâche est de couleur ces boules comme suit et de l'utiliser pour un jeu approprié,
Pour Le Tennis - Jaune, Rouge.
Pour Le Cricket - Blanc
Maintenant seau a des boules dans les trois couleurs Jaune, Rouge et Blanc. Et que maintenant vous avez la coloration que vous savez de quelle couleur est le jeu.
Coloriage boules de Hachage.
Le choix de la balle de jeu Égal.
Si vous avez la colorer et certains on choisit la balle, soit de cricket, de tennis ou ils l'habitude de l'esprit de la couleur!!!
J'étais à la recherche dans l'explication " Si vous remplacez uniquement hashCode puis quand vous appelez
myMap.put(first,someValue)
il prend tout d'abord, calcule son hashCode et les stocke dans un seau. Ensuite, lorsque vous appelezmyMap.put(first,someOtherValue)
il doit remplacer la première avec la seconde que par la Carte de la Documentation parce qu'ils sont égaux (selon notre définition)." :Je pense que la 2ème fois, lorsque nous ajoutons dans
myMap
ensuite, il devrait être le "second" de l'objet commemyMap.put(second,someOtherValue)
1) L'erreur commune est illustré dans l'exemple ci-dessous.
la Voiture verte n'est pas trouvé
2. Problème causé par hashCode()
Le problème est causé par l'onu, la méthode substituée
hashCode()
. Le contrat entreequals()
ethashCode()
est:Si deux objets ont le même code de hachage, ils peuvent ou peuvent ne pas être égaux.
Il est utile lors de l'utilisation de Objets de Valeur. Ce qui suit est un extrait de l' Portland Pattern Repository:
Supposons que vous disposez de la classe (Une) qui regroupe les deux autres (B) (C), et vous avez besoin de stocker des instances de (A) à l'intérieur de la table de hachage. Par défaut seulement la mise en œuvre permet de distinguer des cas, mais pas par (B) et (C). Donc, de deux instances d'Un pourrait être égal, mais par défaut ne vous permettra pas de les comparer entre elles, de manière correcte.
Les méthodes equals et hashcode sont définies dans la classe de l'objet. Par défaut, si la méthode equals retourne true, alors le système va aller plus loin et vérifier la valeur de code de hachage. Si le code de hachage de l'2 objets est également de même que les objets seront considérés comme identiques. Donc, si vous remplacez seulement la méthode equals, alors même si le substituée méthode equals indique 2 objets à l'égalité , le système défini hashcode peut ne pas indiquer que les 2 objets sont égaux. Nous avons donc besoin de remplacer le code de hachage ainsi.
true
pourequals
ne seront pas considérés comme de la correspondance. D'autre part, si les collections arrivent avis que les choses ne peuvent pas avoir le même code de hachage, ils sont susceptibles de ne pas remarquer qu'ils sont égaux.Equals et Hashcode méthodes en Java
Ils sont des méthodes de java.lang.Classe Object qui est la super classe de toutes les classes (classes personnalisées ainsi et autres, définies dans l'API java).
Mise en œuvre:
public boolean equals(Object obj)
Cette méthode vérifie simplement si deux références de l'objet x et y désignent le même objet. c'est à dire qu'Il vérifie si x == y.
Elle est réflexive: pour toute valeur de référence x, x.est égal à(x) doit retourner true.
Elle est symétrique: pour toute référence les valeurs de x et y, x.equals(y) doit retourner true si et seulement si o.est égal à(x) renvoie la valeur true.
Il est transitif: pour toutes les valeurs de référence x, y, et z, si x.equals(y) renvoie la valeur true et y.est égal à(z) renvoie true, alors x.est égal à(z) doit retourner true.
C'est cohérent: pour toute référence les valeurs de x et y, de multiples appels de x.equals(y) constante de retourner true ou systématiquement renvoie la valeur false, a fourni aucune information utilisée dans les égaux des comparaisons sur l'objet est modifié.
public int hashCode()
Cette méthode renvoie le code de hachage de la valeur de l'objet sur lequel cette méthode est invoquée. Cette méthode renvoie le code de hachage de la valeur comme un nombre entier et est pris en charge pour le bénéfice de hachage en fonction des classes de collection tels que la table de hachage, HashMap, HashSet, etc. Cette méthode doit être remplacée, dans chaque classe, qui remplace la méthode equals.
Les conditions générales du contrat de hashCode est:
Chaque fois qu'elle est invoquée sur le même objet plus d'une fois lors d'une exécution d'une application Java, la méthode hashCode doit constamment revenir par le même entier, a fourni aucune information utilisée dans les égaux des comparaisons sur l'objet est modifié.
Cet entier n'a pas besoin de rester cohérent à partir d'une exécution d'une application à une autre exécution de la même application.
Si deux objets sont égaux selon la equals(Object) méthode, puis en appelant la méthode hashCode sur chacun des deux objets doit produire le même résultat sous forme d'entier.
Il n'est pas nécessaire que si deux objets sont inégales selon les equals(java.lang.Objet) méthode, puis en appelant la méthode hashCode sur chacun des deux objets doivent produire integer distinctes résultats. Toutefois, le programmeur doit être conscient que la production d'un integer distinctes résultats de l'inégalité des objets d'améliorer les performances de tables de hachage.
Ressources:
JavaRanch
Image
Dans l'exemple ci-dessous, si vous commentez la substitution est égal ou hashcode dans la classe Personne, ce code ne parviennent pas à chercher Tom de la commande. À l'aide de la valeur par défaut de mise en œuvre de hashcode peut provoquer des échecs dans la table de hachage des recherches.
Ce que j'ai ci-dessous est un code simplifié qui tire vers le haut les gens de la commande par Personne. Personne est en train d'être utilisé comme une clé dans la table de hachage.
Classe String et les classes wrapper ont différentes de mise en œuvre de
equals()
ethashCode()
méthodes de la classe d'Objet. méthode equals() de la classe Object compare les références des objets, pas le contenu. hashCode() la méthode de la classe Object renvoie distinctes hashcode pour chaque objet si le contenu est le même.Il mène problème lorsque vous utilisez la Carte de la collecte et de la clé, c'est de la persistance de type StringBuffer/constructeur de type. Puisqu'ils ne doivent pas remplacer equals() et hashCode() contrairement à la classe String, equals() retourne la valeur false lorsque vous comparez les deux objets différents, même si les deux ont le même contenu. Il fera le hashMap le stockage de contenu même des clés. Le stockage de contenu même des touches signifie qu'il est en train de violer la règle de Carte parce que la Carte ne permet la duplication de clés à tous.
Donc de redéfinir equals() ainsi que hashCode() les méthodes de votre classe et de fournir la mise en oeuvre(IDE peut générer ces méthodes) de sorte qu'ils fonctionnent même que la Chaîne de equals() et hashCode() et empêcher même le contenu des clés.
Vous avez à redéfinir hashCode() la méthode avec equals() parce que equals() de travail selon hashcode.
En outre primordial hashCode() la méthode avec equals() permet à intacte la equals()-hashCode() contrat: "Si deux objets sont égaux, alors ils doivent avoir le même code de hachage."
Quand avez-vous besoin d'écrire personnalisé de mise en œuvre de hashCode()?
Comme nous savons que le travail interne de la table de hachage est sur le principe du Hachage. Il y a certaines seaux où entrysets stockés. Vous pouvez personnaliser le hashCode() de la mise en œuvre en fonction de vos besoins, de sorte que même catégorie d'objets peuvent être stockés dans le même index.
lorsque vous stockez les valeurs dans la collection de cartes à l'aide de
put(k,v)
méthode, la mise en œuvre interne de put() est:Moyens, il génère de l'index et l'index est généré selon le hashcode de la touche particulière de l'objet. Afin de rendre cette méthode de générer hashcode selon votre condition, car même hashcode entrysets sera stocké dans le même compartiment ou de l'indice.
Que c'est!
hashCode()
méthode est utilisée pour obtenir un entier unique pour un objet donné. Cet entier est utilisé pour déterminer le seau emplacement, lorsque cet objet doit être stockée dans certainsHashTable
,HashMap
comme structure de données. Par défaut, l'ObjethashCode()
méthode retourne et représentation entière de l'adresse mémoire où l'objet est stocké.La
hashCode()
méthode des objets est utilisée lorsque nous insérer dans unHashTable
,HashMap
ouHashSet
. Plus surHashTables
sur Wikipedia.org pour référence.Pour insérer une entrée dans la carte de structure de données, nous avons besoin à la fois d'une clé et une valeur. Si les deux clés et les valeurs sont de l'utilisateur de définir des types de données, la
hashCode()
de la clé sera de déterminer où le stockage de l'objet interne. Lors de l'exiger pour la recherche de l'objet à partir de la carte, le code de hachage de la clé sera de déterminer le lieu de la recherche de l'objet.Le code de hachage seuls points à une certaine "zone" (ou d'une liste, seau, etc) en interne. Depuis les différents objets clés pourrait avoir le même code de hachage, le code de hachage lui-même n'est pas une garantie que la touche de droite est trouvé. Le
HashTable
puis itère ce domaine (toutes les touches avec le même code de hachage) et utilise la clé duequals()
méthode pour trouver la bonne clé. Une fois que la clé est trouvée, l'objet stocké pour que la clé est retourné.Donc, comme nous pouvons le voir, une combinaison de la
hashCode()
etequals()
méthodes sont utilisées lors du stockage et lors de la recherche d'objets dans unHashTable
.NOTES:
Toujours utiliser les mêmes attributs d'un objet pour générer
hashCode()
etequals()
à la fois. Comme dans notre cas, nous avons utilisé l'id de l'employé.equals()
doit être cohérente (si les objets ne sont pas modifiées, alors elle doit retourner la même valeur).Chaque fois que
a.equals(b)
, puisa.hashCode()
doit être la même queb.hashCode()
.Si vous remplacez un, alors vous devez remplacer l'autre.
http://parameshk.blogspot.in/2014/10/examples-of-comparable-comporator.html
hashCode()
n'est pas utilisé pour renvoyer un entier unique pour chaque objet. Ce qui est impossible. Vous avez contredit ce vous-même dans la deuxième phrase du quatrième alinéa.À mon humble avis, c'est comme pour la règle dit - Si deux objets sont égaux, alors ils devraient avoir le même hash, c'est à dire, de l'égalité des objets devrait produire de l'égalité des valeurs de hachage.
Donné ci-dessus, par défaut égal à() dans l'Objet est == qui n'comparaison sur l'adresse, le hashCode() renvoie l'adresse en entier(de hachage sur l'adresse réelle) qui est encore une fois distinctes pour les Objets distincts.
Si vous avez besoin d'utiliser les Objets personnalisés dans le Hachage en fonction des collections, vous devez remplacer les deux equals() et hashCode(), exemple Si je veux maintenir le HashSet de l'Employé Objets, si je ne l'utilise pas plus hashCode et equals je peut endup substituant les deux Employés des Objets, ce qui se passe quand je utiliser l'âge comme le hashCode(), mais je devrais être en utilisant la valeur unique qui peut être l'ID de l'Employé.
Pour vous aider à vérifier pour dupliquer des Objets, nous avons besoin d'un custom equals et hashCode.
Depuis hashcode retourne toujours un certain nombre de ses toujours rapide pour récupérer un objet à l'aide d'un numéro plutôt que par une touche alphabétique. Comment faut-il faire? Supposons que nous avons créé un nouvel objet par le passage d'une certaine valeur qui est déjà disponible dans un autre objet. Maintenant, le nouvel objet sera de retour la même valeur de hachage, comme d'un autre objet, car la valeur passée est la même. Une fois la même valeur de hachage est retourné, la JVM va aller à la même adresse mémoire à chaque fois et si dans le cas où il y a plus que les objets présents pour la même valeur de hachage, il va utiliser la méthode equals() pour identifier l'objet correct.
Lorsque vous souhaitez stocker et de récupérer votre objet personnalisé comme un élément clé dans la Carte, puis vous devez toujours remplacer equals et hashCode dans votre Objet personnalisé .
Par exemple:
Ici p1 & p2 considérer comme un seul objet et
map
taille sera de seulement 1, parce qu'ils sont égaux.De La Classe De Test
Dans la Classe d'Objet equals(Object obj) est utilisé pour comparer l'adresse comparesion c'est pourquoi, lorsque dans la classe de Test, si vous comparez les deux objets, puis méthode equals donner de faux, mais quand on remplacer hashcode() que l'on peut comparer le contenu et donner un bon résultat.
À la fois les méthodes sont définies dans la classe d'Objet. Et les deux sont dans sa forme la plus simple de mise en œuvre. Lorsque vous avez besoin que vous voulez ajouter un peu plus de mise en œuvre de ces méthodes, alors vous devez remplacer dans votre classe.
Ex: méthode equals() dans l'objet vérifie uniquement pour l'égalité sur la référence. Donc, si vous avez besoin de comparer son état ainsi, vous pouvez ignorer que, comme c'est fait dans la classe String.
Bah - "il est nécessaire de redéfinir hashCode() dans chaque classe qui remplace equals()."
[Efficaces Java, par Joshua Bloch?]
N'est-ce pas dans le mauvais sens? Primordial hashCode probablement suppose que vous écrivez un mot-clé de la classe, mais impérieuse d'égal à égal n'est certainement pas. Il y a beaucoup de classes qui ne sont pas utilisés en tant que mot-clés, mais ne voulez une logique de l'égalité-méthode d'essai pour une autre raison. Si vous choisissez "équivaut à" pour cela, vous pouvez alors être mandaté pour écrire un hashCode de la mise en œuvre par les excès de zèle de l'application de cette règle. Tout ce qui est fait est l'ajout du code non testé dans la base de code, un mal d'attente pour faire trébucher quelqu'un dans le futur. Aussi l'écriture de code, vous n'avez pas besoin d'anti-agile. Il est tout simplement faux (et un ide généré sera probablement incompatible avec votre main est égal).
Sûrement, ils devraient avoir mandaté une Interface sur des objets écrits pour être utilisés comme clés? Peu importe, l'Objet ne doit jamais avoir par défaut fourni par hashCode() et equals() à mon humble avis. Il est surement encouragé de nombreux cassé hachage collections.
Mais de toute façon, je pense que la "règle" est écrit de l'arrière vers l'avant. En attendant, je vais continuer à éviter l'utilisation des "égaux" pour l'égalité des méthodes d'essai 🙁