Remplacer la fonction Hashcode en Java

Rupam Yadav 12 octobre 2023
  1. Pourquoi remplaçons-nous la méthode hashcode()
  2. Remplacer la méthode hashcode() en Java
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
Auteur: Rupam Yadav
Rupam Yadav avatar Rupam Yadav avatar

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