![translation](https://cdn.durumis.com/common/trans.png)
Ez egy AI által fordított bejegyzés.
Válasszon nyelvet
A durumis AI által összefoglalt szöveg
- Az equals() az objektumok tartalmának összehasonlítására szolgáló metódus, a hashCode() az objektumok egyedi egész értékét adja vissza, és mindkettő az objektumok összehasonlításához használatos.
- A hash-adatszerkezetekben a hashCode() a kulcs meghatározásához használatos, ezért az equals() és a hashCode() is felülírható a azonos hash-kód biztosítása érdekében.
- Az equals() és a hashCode() együtt használva hatékonyan kezelhetjük az azonos objektumokat a hash-adatszerkezetekben.
equals()
Az equals() meghatározza, hogy két objektum tartalma azonos-e. Ezt gyakran egyenlőség-összehasonlításnak nevezik, és ha nem írjuk felül az equals() metódust, akkor a belső működése megegyezik a == operátorral, azaz egyenlőség-összehasonlítást végez. Ezért, ha helyesen szeretnénk összehasonlítani az objektumok tartalmát, akkor feltétlenül az equals() metódust kell használnunk.
public boolean equals(Object obj) {
return (this == obj);
hashCode()
A hashCode() meghatározza, hogy két objektum azonos-e. Ugyanazt a funkciót látja el, mint a == operátor (egyenlőség-összehasonlítás), de a hashCode() metódus egy futási időbeli egyedi egész számot ad vissza az objektumról. Általában a heapen tárolt objektum memória címét adja vissza.
Ez a metódus egy native kulcsszóval van ellátva, ami azt jelenti, hogy Java-n kívül más nyelven kifejlesztett nyelvet használhatunk Java-ban.
Mi a hash?
A hasholás egy olyan folyamat, amely egy változó hosszúságú bemeneti értéket átalakít egy rögzített hosszúságú kimenetté egy hash függvény segítségével. A hasholás során kapott értéket hash kódnak nevezzük.
equals() és hashCode()
Mivel az azonos objektumoknak azonos memória címmel kell rendelkezniük, egyértelmű, hogy az azonos objektumoknak azonos hash kóddal kell rendelkezniük. Ezért kívánatos, hogy a kódunkban az equals() mellett a hashCode() metódust is felülírjuk, hogy biztosítsuk az azonos hash kódot.
Hash adatstruktúrák
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);
}
Adjunk hozzá egy azonos objektumot kétszer egy HashSet adatstruktúrához. Ha kiírjuk a Set méretét, akkor 2 lesz az eredmény. Miért?
A hash-t alkalmazó adatstruktúrák a hashCode() metódust használják a kulcs meghatározásához. Azaz, mielőtt összehasonlítanánk az objektumokat, összehasonlítjuk a két objektum hash kódját, és csak ezután határozzuk meg, hogy a két objektum azonos-e. Ha a hashCode() metódus nincs felülírva, akkor az Object hashCode() metódusát használjuk, amely a heapen tárolt objektum memória címét adja vissza. Ezért ajánlatos a hashCode() metódust is felülírni az equals() mellett, ha hash adatstruktúrákat használunk.
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);
}
Forrás
Várható interjúkérdések és válaszok
Miért használjuk az equals() és a hashCode() metódusokat együtt?
A hash-t alkalmazó adatstruktúrák a hashCode() metódust használják a kulcs meghatározásához. Azaz, mielőtt összehasonlítanánk az objektumokat, összehasonlítjuk a két objektum hash kódját, és csak ezután határozzuk meg, hogy a két objektum azonos-e. Ha a hashCode() metódus nincs felülírva, akkor az Object hashCode() metódusát használjuk, amely a heapen tárolt objektum memória címét adja vissza. Ezért ajánlatos a hashCode() metódust is felülírni az equals() mellett, ha hash adatstruktúrákat használunk.