Java Hashing und HashCode

JavaJavaBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir uns mit der hashCode()-Methode in Java befassen. Hashing ist eine Technik, die verwendet wird, um einen eindeutigen Wert für einen gegebenen Schlüssel zu generieren. Hashing wird verwendet, um Hash-Tabellen zu implementieren, und diese Datenstrukturen bieten eine schnellere und effizientere Möglichkeit, Daten zu suchen. Die hashCode()-Methode gibt einen ganzzahligen Wert für einen gegebenen Schlüssel zurück. Wir werden lernen, wie die hashCode()-Methode verwendet wird und die Wichtigkeit eines starken hashCode()-Verfahrens.

Erstellen einer Studentenklasse

Zunächst erstellen wir eine Student-Klasse mit Feldern wie Name, Matrikelnummer und GPA.

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

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

}

Verwendung der equals()-Methode

Die equals()-Methode wird verwendet, um zu überprüfen, ob zwei Objekte gleich sind oder nicht. Im vorliegenden Fall werden wir zwei Student-Objekte anhand ihres Namens, ihrer Matrikelnummer und ihres GPA vergleichen.

@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);
}

Implementierung der hashCode()-Methode

Die hashCode()-Methode gibt einen ganzzahligen Wert für einen gegebenen Schlüssel zurück. Wir werden eine einfache hashCode()-Methode implementieren, die einfach einen ganzzahligen Wert basierend auf dem ersten Buchstaben des Namens des Studenten zurückgibt.

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

Verwendung der hashCode()-Methode

Wir können jetzt die hashCode()-Methode verwenden, um Hashcodes für die Student-Objekte zu generieren.

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());

Implementierung einer starken hashCode()-Methode

Die vorherige hashCode()-Methode ist nicht sehr stark, da verschiedene Studenten mit dem gleichen ersten Buchstaben ihres Namens den gleichen Hash-Wert zugewiesen bekommen. Lassen Sie uns die anderen Felder der Klasse verwenden, um eine stärkere hashCode()-Methode zu schreiben.

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

Verwendung der eingebauten hashCode()-Methode

Wir können auch die eingebautes hashCode()-Methode für die String-Klasse verwenden, um Hashcodes für die Student-Klasse zu generieren.

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

Überprüfung der Gleichheit

Lassen Sie uns jetzt die Gleichheit zweier Student-Objekte mit der equals()-Methode überprüfen.

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));

Implementierung von hashCode() für Set

Wir können die Student-Klasse in einem HashSet verwenden. Um das HashSet richtig zu funktionieren, müssen wir sowohl die equals()- als auch die hashCode()-Methode überschreiben.

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()); // Ausgabe: 2

Implementierung von hashCode() für Map

Wir können auch die Student-Klasse in einer HashMap verwenden. Um die HashMap richtig zu funktionieren, müssen wir sowohl die equals()- als auch die hashCode()-Methode überschreiben.

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()); // Ausgabe: 2

Ausführen des Codes

Um den Code auszuführen, navigieren Sie zunächst mithilfe des cd-Befehls zum Verzeichnis, in dem der Code gespeichert ist. Verwenden Sie dann den javac-Befehl, um den Code zu kompilieren, und den java-Befehl, um den Code auszuführen.

cd ~/project
javac HashCodeDemo.java
java HashCodeDemo

Zusammenfassung

In diesem Lab haben wir uns mit der hashCode()-Methode in Java beschäftigt, die verwendet wird, um einen eindeutigen Wert für einen gegebenen Schlüssel zu generieren. Wir haben die hashCode()- und equals()-Methoden für die Student-Klasse implementiert und gelernt, wie man eine starke hashCode()-Methode schreibt. Wir haben auch gelernt, wie man die hashCode()- und equals()-Methoden in HashSet und HashMap verwendet.