Comment redéfinir les méthodes equals() et hashCode() en Java
Les méthodes equals() et hashCode(). Ces deux méthodes sont définies dans la classe java.lang.Object
. Nous utilisons la méthode equals() pour comparer si deux objets sont équivalents, ce qui signifie que les deux objets eux-mêmes (et non les références) sont égaux. Pour vérifier si les références d’objet sont égales ou non, nous utilisons l’opérateur == qui utilise la valeur du code de hachage de l’objet pour l’évaluer.
La méthode hashcode() est utilisé pour générer une valeur de code de hachage pour un objet et cette valeur de code de hachage est utilisée par certaines classes de collection pour comparer des objets, ce qui augmente les performances des grandes collections d’objets.
Définissons notre classe Student pour laquelle nous allons redéfinir les méthodes hashcode() et equals().
public class Student { private String name; private int age; public Student(){} public Student(String name, int age) { this.age = age; this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
Redéfinir la méthode HashCode
Voici l’exemple de code que nous avons ajouté à la classe Student pour redéfinir la méthode hashcode().
@Override public int hashCode() { int result = 17; result = 31 * result + (name == null ? 0 :name.hashCode()); result = 31 * result + age; return result; }
L’utilisation de 31 comme hash est juste pour assurer que la valeur du hashcode sera différent pour chaque objet. Vous devez calculer le hachage pour différents membres et renvoyer le total sous forme de code de hachage unique.
Redéfinir la méthode equals
Voici l’exemple de code que nous avons ajouté à la classe Student pour redéfinir la méthode equals().
@Override public boolean equals(Object obj){ if(obj == null) return false; if(obj instanceof Student && this == obj) return true; Student student = (Student)obj; if(age != student.age) return false; if(name != null && !name.equalsIgnoreCase(student.name)) return false; return true; }
Exécutez le code ci-dessous, pour vérifier la redéfinition des méthodes equals() et hashCode().
public class Test { public static void main(String [] args){ Student student1 = new Student("Alex", 22); Student student2 = new Student("Alex", 23); System.out.println(student1.equals(student2)); // false } }
Le contrat entre Hashcode et Equals :
- Si deux objets sont égaux selon la méthode equals(), leurs code de hachage doivent être identiques.
- Si deux objets ne sont pas égaux selon la méthode equals(), leur code de hachage peut être identique ou différent.
Your page is very interesting, i have bookmarked it.