Remplacer la fonction Hashcode en Java
hashcode
en Java est une fonction qui utilise l’algorithme de hachage et renvoie une valeur entière représentant un objet. hashcode()
fait partie de la classe Object
, ce qui signifie que cette fonction est disponible pour chaque classe qui hérite de la classe Object
.
Cet article montrera comment nous pouvons remplacer la méthode hashcode()
pour fournir notre implémentation.
Pourquoi remplaçons-nous la méthode hashcode()
Avant de remplacer la fonction hashcode()
, nous devons comprendre pourquoi nous devons remplacer cette méthode. La chose importante à garder à l’esprit est que les méthodes equals()
et hashcode()
vont ensemble et qu’il est généralement obligatoire de remplacer la méthode hashcode()
chaque fois que la fonction equals()
est remplacée. C’est parce que hashcode()
dit que si les objets sont égaux, leurs codes de hachage doivent également être égaux.
Pour comprendre concrètement le motif du remplacement de la méthode hashcode()
, nous créons un exemple avec deux classes appelées HashCodeExample
et DummyClass
. Dans DummyClass
, nous fournissons un constructeur simple qui définit la variable abc
. Maintenant, dans la classe HashCodeExample
, nous créons deux instances de la classe DummyClass
et les nommons dummyClass1
et dummyclass2
avec la même valeur dans leurs constructeurs.
Nous comparons les deux instances à l’aide de la méthode equals()
, mais la sortie montre qu’elles ne sont pas égales.
public class HashCodeExample {
public static void main(String[] args) {
DummyClass dummyClass1 = new DummyClass(10);
DummyClass dummyClass2 = new DummyClass(10);
System.out.println(dummyClass1.equals(dummyClass2));
}
}
class DummyClass {
int abc;
public DummyClass(int abc) {
this.abc = abc;
}
}
Production :
false
Cela se produit parce que chaque instance d’objet en Java reçoit un code de hachage unique que nous pouvons vérifier en appelant la méthode hashCode()
sur les deux objets. La sortie montre que les valeurs entières des deux objets sont différentes.
System.out.println(dummyClass1.hashCode());
System.out.println(dummyClass2.hashCode());
Production :
2065951873
1791741888
Pour résoudre le problème des objets inégaux, nous pouvons remplacer la fonction equals()
et utiliser notre implémentation. Le code suivant est le même que le premier programme, mais nous redéfinissons la méthode equals()
qui prend un Object
comme argument et retourne un boolean
.
Dans la fonction equals()
, nous convertissons le paramètre o
de type Object
en type de DummyClass
qui renvoie une instance de DummyClass
. Maintenant, nous comparons la variable abc
de la classe DummyClass
avec la variable de l’objet abc
qui est passée dans la méthode en argument.
La sortie montre que le résultat de dummyClass1.equals(dummyClass2)
est true
car nous avons modifié l’implémentation par défaut pour renvoyer true si les valeurs des instances sont les mêmes.
public class HashCodeExample {
public static void main(String[] args) {
DummyClass dummyClass1 = new DummyClass(10);
DummyClass dummyClass2 = new DummyClass(10);
System.out.println(dummyClass1.equals(dummyClass2));
}
}
class DummyClass {
int abc;
public DummyClass(int abc) {
this.abc = abc;
}
@Override
public boolean equals(Object o) {
DummyClass dummyClassObj = (DummyClass) o;
return this.abc == dummyClassObj.abc;
}
}
Production :
true
La solution ci-dessus ne fonctionne que lorsque nous comparons les valeurs et non les codes de hachage car les codes de hachage des objets dummyClass1
et dummyClass2
sont toujours différents.
Pour mieux l’illustrer, nous créons un HashSet()
qui retourne un objet de type Set<DummyClass>
et y ajoutons les deux objets DummyClass
à l’aide de la fonction add()
. Maintenant, nous imprimons le Set
et obtenons deux objets avec des références différentes dans la sortie, ce qui prouve que les objets DummyClass
ont des codes de hachage différents.
C’est là que nous redéfinissons la fonction hashcode()
pour résoudre le problème, ce que nous verrons dans l’exemple suivant ci-dessous.
import java.util.HashSet;
import java.util.Set;
public class HashCodeExample {
public static void main(String[] args) {
DummyClass dummyClass1 = new DummyClass(10);
DummyClass dummyClass2 = new DummyClass(10);
Set<DummyClass> dummyClassSet = new HashSet<>();
dummyClassSet.add(dummyClass1);
dummyClassSet.add(dummyClass2);
System.out.println(dummyClassSet);
}
}
class DummyClass {
int abc;
public DummyClass(int abc) {
this.abc = abc;
}
@Override
public boolean equals(Object o) {
DummyClass dummyClass = (DummyClass) o;
return this.abc == dummyClass.abc;
}
}
Production :
[DummyClass@7b23ec81, DummyClass@6acbcfc0]
Remplacer la méthode hashcode()
en Java
Pour utiliser notre implémentation dans la méthode hashcode()
, nous redéfinissons d’abord la méthode hashcode()
dans la classe DummyClass
et renvoyons la valeur de la variable abc
de la classe. Maintenant, le code de hachage est remplacé par la valeur de abc
. Maintenant, si nous imprimons dummyClassSet
, nous obtenons un seul objet car le code de hachage ou la référence est le même.
import java.util.HashSet;
import java.util.Set;
public class HashCodeExample {
public static void main(String[] args) {
DummyClass dummyClass1 = new DummyClass(10);
DummyClass dummyClass2 = new DummyClass(10);
Set<DummyClass> dummyClassSet = new HashSet<>();
dummyClassSet.add(dummyClass1);
dummyClassSet.add(dummyClass2);
System.out.println(dummyClassSet);
}
}
class DummyClass {
int abc;
public DummyClass(int abc) {
this.abc = abc;
}
@Override
public boolean equals(Object o) {
DummyClass dummyClass = (DummyClass) o;
return this.abc == dummyClass.abc;
}
@Override
public int hashCode() {
return abc;
}
}
Production :
[DummyClass@a]
Si nous imprimons les codes de hachage des objets dummyClass1
et dummyClass2
, nous obtenons les mêmes codes de hachage.
System.out.println(dummyClass1.hashCode());
System.out.println(dummyClass2.hashCode());
Production :
10
10
Rupam Saini is an android developer, who also works sometimes as a web developer., He likes to read books and write about various things.
LinkedIn