![translation](https://cdn.durumis.com/common/trans.png)
Dies ist ein von KI übersetzter Beitrag.
Sprache auswählen
Von durumis AI zusammengefasster Text
- equals() ist eine Methode, die vergleicht, ob der Inhalt von Objekten gleich ist, und hashCode() ist eine Methode, die einen eindeutigen Integer-Wert für ein Objekt zurückgibt. Beide werden zum Vergleichen von Objekten verwendet.
- In Hash-Datenstrukturen wird hashCode() verwendet, um Schlüssel zu bestimmen. Daher müssen equals() und hashCode() zusammen überschrieben werden, um den gleichen Hashcode zu gewährleisten.
- Die gemeinsame Verwendung von equals() und hashCode() ermöglicht eine effiziente Verwaltung identischer Objekte in Hash-Datenstrukturen.
equals()
equals() vergleicht den Inhalt eines Objekts. Dies wird oft als Vergleich der Gleichheit bezeichnet. Wenn equals() nicht überschrieben wird, ist es intern mit == identisch, d.h. es handelt sich um einen Vergleich der Identität. Daher ist es wichtig, equals() zu verwenden, wenn Sie Objekte korrekt auf Gleichheit vergleichen möchten.
public boolean equals(Object obj) {
return (this == obj);
hashCode()
hashCode() prüft, ob zwei Objekte dasselbe Objekt sind. Es handelt sich um eine Identitätsvergleichsfunktion wie ==, aber die hashCode()-Methode gibt einen eindeutigen Integer-Wert für das Objekt zur Laufzeit zurück. Im Allgemeinen wird die Speicheradresse des Objekts zurückgegeben, das im Heap gespeichert ist.
Die Methode hat das Schlüsselwort native, was bedeutet, dass sie verwendet wird, wenn eine in einer anderen Sprache als Java entwickelte Sprache in Java verwendet wird.
Was ist Hashing?
Hashing ist der Prozess, bei dem ein Hash-Algorithmus verwendet wird, um aus einem Eingabewert variabler Größe einen Ausgabewert fester Größe zu generieren. Der so erzeugte Wert wird Hash-Code genannt.
equals() und hashCode()
Da identische Objekte dieselbe Speicheradresse haben müssen, ist es selbstverständlich, dass identische Objekte denselben Hash-Code haben müssen. Daher ist es ratsam, den Code so zu schreiben, dass sowohl equals() als auch hashCode() überschrieben werden, um sicherzustellen, dass der gleiche Hash-Code generiert wird.
Hash-Datenstrukturen
public class Main {
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 2
}
}
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
Fügen wir eine Datenstruktur vom Typ HashSet mit zwei identischen Objekten hinzu. Wenn die Größe dieses Sets ausgegeben wird, ist das Ergebnis 2. Warum?
Der Grund dafür ist, dass bei der Verwendung einer Datenstruktur mit Hashing die hashCode()-Methode zur Bestimmung des Schlüssels verwendet wird. Das bedeutet, dass vor dem Vergleich der Identität zweier Objekte zunächst überprüft wird, ob die Hash-Codes der beiden Objekte übereinstimmen, und danach wird festgestellt, ob die beiden Objekte identisch sind. Wenn hashCode() nicht überschrieben wird, wird die hashCode()-Methode von Object verwendet, wodurch die Speicheradresse zurückgegeben wird, an der jedes Objekt gespeichert ist. Daher ist es empfehlenswert, hashCode() zusätzlich zu equals() zu überschreiben, wenn eine Hash-Datenstruktur verwendet wird.
public static void main(String[] args) throws IOException {
Set people = new HashSet<>();
people.add(new Person("제이온", 23));
people.add(new Person("제이온", 23));
System.out.println(people.size()); // 1
}
}
class Person {
private final String name;
private final int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age && Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
Quelle
Erwartete Interviewfragen und Antworten
Warum werden equals() und hashCode() zusammen verwendet?
Der Grund dafür ist, dass bei der Verwendung einer Datenstruktur mit Hashing die hashCode()-Methode zur Bestimmung des Schlüssels verwendet wird. Das bedeutet, dass vor dem Vergleich der Identität zweier Objekte zunächst überprüft wird, ob die Hash-Codes der beiden Objekte übereinstimmen, und danach wird festgestellt, ob die beiden Objekte identisch sind. Wenn hashCode() nicht überschrieben wird, wird die hashCode()-Methode von Object verwendet, wodurch die Speicheradresse zurückgegeben wird, an der jedes Objekt gespeichert ist. Daher ist es empfehlenswert, hashCode() zusätzlich zu equals() zu überschreiben, wenn eine Hash-Datenstruktur verwendet wird.