Nous savons tous que la langue Java est complètement orientée objet. Dans Java, tous les objets sont hérités de la classe d'objets.
La méthode Equals compare les adresses pointées par les références de deux objets. HashCode est une méthode locale, qui renvoie la valeur d'adresse de l'objet. Il existe deux méthodes dans la classe OJBECT EQUALS ET HASHCODE. Ces deux méthodes sont utilisées pour comparer si les deux objets sont égaux.
Pourquoi devons-nous remplacer la méthode HashCode lors de la réécriture de la méthode Equals?
Il peut être compris comme suit: Après la réécriture de la méthode égale, la logique métier pour juger l'égalité des objets changera. Le concepteur de la classe ne veut pas comparer l'égalité des deux objets en comparant l'adresse mémoire. Il n'a pas de sens de continuer à comparer en fonction de l'adresse. Donc, il est simplement changé ensemble.
Une autre raison vient des collections. Parlons-en lentement en dessous ~
Par exemple:
À l'école, c'est par le biais de la pièce d'identité des élèves de déterminer si cette personne appartient.
Le scénario du code ci-dessous est l'entrée des enregistrements des étudiants, le numéro 123 de l'étudiant est affecté à l'étudiant Tom, le numéro 456 de l'étudiant est affecté à l'étudiant Jerry et le numéro 123 de l'étudiant est affecté à Lily par erreur. Cependant, le même numéro d'étudiant ne devrait pas se produire pendant le processus d'inscription du statut d'étudiant.
Selon les exigences situationnelles, les objets en double ne peuvent pas être ajoutés et peuvent être implémentés via HashSet.
Test de classe publique {public static void main (String [] args) {étudiant Stu = new Student (123, "Tom"); hashset <Student> set = new Hashset <> (); set.add (Stu); set.add (New Student (456, "Jerry")); set.add (New Student. while (iterator.hasnext ()) {étudiant étudiant = iterator.next (); System.out.println (Student.getStum () + "---" + Student.getName ());}}}; classe Student {private int StrothUm; private String Name; Public Student (int étallum, public name) {this.stumum = STUMUM; this.name = name;} public int Getstum () {return Sweum;} public String GetName () {retourne noms;}} {return Sweum;} public String Getname () {Retour Nom. booléen égaux (objet obj) {if (this == obj) return true; if (obj instanceof student) {if (this.getStum () == ((student) obj) .getStum ()) return true;} return false;}} La sortie est:
123 --- Lily
456 --- Jerry
123 --- Tom
Sur la base de la sortie, nous avons constaté que l'attribution du numéro 123 de l'élève à Lily a de nouveau réussi. Qu'est-ce qui ne va pas?
Jetons un coup d'œil à la méthode ADD de Hashset:
public boolean add (e e) {return map.put (e, présent) == null;} En fait, HashSet est implémenté via HashMap, nous tracez donc la méthode de put de HashMap:
public v put (k key, v valeur) {if (table == vide_table) {inflatetable (threshold);} if (key == null) return putFornullKey (value); int hash = hash (key); int i = indexfor (hash, table.length); pour (entrée <k, v> e = table [i]; e! = null; e = e.next) {objectif k; hash && ((k = e.key) == key || key.equals (k))) {v oldValue = e.Value; e.Value = value; e.recordAccess (this); return oldValue;}} modCount ++; AddentRy (hash, key, value, i); return null;}1. Selon la clé, c'est-à-dire l'objet à ajouter par HashSet, obtenez le HashCode et le HashCode est utilisé pour effectuer des opérations de bit spécifiques pour obtenir le code de hash;
2. Utilisez le positionnement du code de hachage pour trouver l'indice du tableau pour obtenir l'en-tête de lien de la liste liée;
3. Traversez la liste liée pour savoir s'il y a la même clé. La base du jugement est e.hash == hash && ((k = e.key) == key || key.equals (k)). Lors de l'ajout de Lily, parce que la méthode égale est réécrite, la deuxième condition doit être vraie lors de la traversée Tom; Mais parce que la méthode HashCode utilise toujours la classe parent, le HashCode de Tom et Lily est différent, c'est-à-dire que le code de hash est différent et la première condition est fausse. Ici, nous comprenons que les deux objets sont différents, donc HashSet ajoute Lily avec succès.
La raison en est que la méthode HashCode n'est pas la réécriture. Voici une modification:
Test de classe publique {public static void main (String [] args) {étudiant Stu = new Student (123, "Tom"); hashset <Student> set = new Hashset <> (); set.add (Stu); set.add (New Student (456, "Jerry")); set.add (New Student. while (iterator.hasnext ()) {étudiant étudiant = iterator.next (); System.out.println (Student.getStum () + "---" + Student.getName ());}}}; classe Student {private int StrothUm; private String Name; Public Student (int étallum, public name) {this.stumum = STUMUM; this.name = name;} public int Getstum () {return Sweum;} public String GetName () {retourne noms;}} {return Sweum;} public String Getname () {Retour Nom. booléen égaux (objet obj) {if (this == obj) return true; if (obj instanceof student) {if (this.getStum () == ((student) obj) .getStum ()) return true;} return false;} @ overRidePublic int hashcode () {return getStum ();}} Sortir:
456 --- Jerry
123 --- Tom
Réécrivez la méthode HashCode et renvoyez le numéro d'étudiant. Ok, c'est fait.
Certaines personnes peuvent se demander, e.hash == hash && ((k = e.key) == key || key.equals (k)) est un peu compliqué? Je pense qu'il suffit d'utiliser la méthode égaux. Pourquoi avez-vous besoin de juger HashCode en une seule fois?
Étant donné que lorsque vous traversez et jugez dans la structure de la liste liée de HashMap, la logique métier de la méthode égale à réécriture est plus compliquée pour comparer si les objets sont égaux dans des situations spécifiques, et la logique métier de la boucle affectera l'efficacité de recherche. Nous avons donc ici mis le jugement de HashCode en premier. Tant que le HashCode n'est pas égal, vous finirez de jouer et il n'est plus nécessaire d'appeler des égaux complexes. Améliorer l'efficacité du hashmap dans une large mesure.
Par conséquent, la méthode HashCode consiste à nous permettre d'utiliser des classes de collecte telles que HashMap normalement, car HashMAP détermine si les objets sont égaux, à la fois HashCode et égal à la comparaison. Cette mise en œuvre est d'améliorer l'efficacité du hashmap.