Hachage Java et hashCode

JavaBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire, nous allons apprendre à connaître la méthode hashCode() en Java. Le hachage est une technique utilisée pour générer une valeur unique pour une clé donnée. Le hachage est utilisé pour implémenter les tables de hachage et ces structures de données offrent un moyen plus rapide et plus efficace de rechercher des données. La méthode hashCode() renvoie une valeur entière pour une clé donnée. Nous allons apprendre à utiliser la méthode hashCode() et l'importance d'écrire une méthode hashCode() robuste.

Création d'une classe Student

Tout d'abord, créons une classe Student avec des champs tels que le nom, le numéro d'inscription et la moyenne générale.

class Student {
  String name;
  int regNo;
  double gpa;

  Student(String name, int regNo, double gpa) {
    this.name = name;
    this.regNo = regNo;
    this.gpa = gpa;
  }

}

Utilisation de la méthode equals()

La méthode equals() est utilisée pour vérifier si deux objets sont égaux ou non. Dans ce cas, nous allons comparer deux objets Student sur la base de leur nom, de leur numéro d'inscription et de leur moyenne générale.

@Override
public boolean equals(Object obj) {
  if (this == obj) {
    return true;
  }
  if (obj == null || getClass()!= obj.getClass()) {
    return false;
  }
  Student student = (Student) obj;
  return regNo == student.regNo &&
         Double.compare(student.gpa, gpa) == 0 &&
         Objects.equals(name, student.name);
}

Implémentation de la méthode hashCode()

La méthode hashCode() renvoie une valeur entière pour une clé donnée. Nous allons implémenter une méthode hashCode() de base qui renvoie simplement un entier en fonction de la première lettre du nom de l'étudiant.

@Override
public int hashCode() {
  return (int) this.name.charAt(0) - 64;
}

Utilisation de la méthode hashCode()

Nous pouvons maintenant utiliser la méthode hashCode() pour générer des codes de hachage pour les objets Student.

Student s1 = new Student("Alice", 1, 3.7);
Student s2 = new Student("Bob", 2, 3.9);

System.out.println("s1's hash code: " + s1.hashCode());
System.out.println("s2's hash code: " + s2.hashCode());

Implémentation d'une méthode hashCode() robuste

La méthode hashCode() précédente n'est pas très robuste, car différents étudiants ayant la même première lettre de leur nom seront assignés la même valeur de hachage. Utilisons les autres champs de la classe pour écrire une méthode hashCode() plus robuste.

@Override
public int hashCode() {
  return ((int) this.name.charAt(0) - 64) * this.regNo * (int) this.gpa;
}

Utilisation de la méthode hashCode() intégrée

Nous pouvons également utiliser la méthode hashCode() intégrée de la classe String pour générer des codes de hachage pour la classe Student.

@Override
public int hashCode() {
  return Objects.hash(name, regNo, gpa);
}

Vérification de l'égalité

Maintenant, vérifions l'égalité de deux objets Student à l'aide de la méthode equals().

Student s1 = new Student("Alice", 1, 3.7);
Student s2 = new Student("Bob", 2, 3.9);
Student s3 = new Student("Alice", 1, 3.7);

System.out.println("s1 equals s2: " + s1.equals(s2));
System.out.println("s1 equals s3: " + s1.equals(s3));

Implémentation de hashCode() pour Set

Nous pouvons utiliser la classe Student dans un HashSet. Nous devons redéfinir les méthodes equals() et hashCode() pour que le HashSet fonctionne correctement.

Set<Student> studentSet = new HashSet<>();
studentSet.add(new Student("Alice", 1, 3.7));
studentSet.add(new Student("Bob", 2, 3.9));
studentSet.add(new Student("Alice", 1, 3.7));

System.out.println(studentSet.size()); // Output: 2

Implémentation de hashCode() pour Map

Nous pouvons également utiliser la classe Student dans une HashMap. Nous devons redéfinir les méthodes equals() et hashCode() pour que la HashMap fonctionne correctement.

Map<Student, String> studentMap = new HashMap<>();
studentMap.put(new Student("Alice", 1, 3.7), "Good");
studentMap.put(new Student("Bob", 2, 3.9), "Excellent");
studentMap.put(new Student("Alice", 1, 3.7), "Very Good");

System.out.println(studentMap.size()); // Output: 2

Exécution du code

Pour exécuter le code, d'abord, accédez au répertoire où le code est enregistré en utilisant la commande cd. Ensuite, utilisez la commande javac pour compiler le code et la commande java pour exécuter le code.

cd ~/project
javac HashCodeDemo.java
java HashCodeDemo

Résumé

Dans ce laboratoire, nous avons appris sur la méthode hashCode() en Java, qui est utilisée pour générer une valeur unique pour une clé donnée. Nous avons implémenté les méthodes hashCode() et equals() pour la classe Student et avons appris à écrire une méthode hashCode() robuste. Nous avons également appris comment utiliser les méthodes hashCode() et equals() dans HashSet et HashMap.