![translation](https://cdn.durumis.com/common/trans.png)
To jest post przetłumaczony przez AI.
Wybierz język
Tekst podsumowany przez sztuczną inteligencję durumis
- `equals()` to metoda porównująca, czy zawartość obiektów jest taka sama, a `hashCode()` to metoda zwracająca unikalną wartość całkowitą obiektu, obie służą do porównywania obiektów.
- W strukturach danych typu hash `hashCode()` jest używany do określania klucza, dlatego należy ponownie zdefiniować `equals()` i `hashCode()`, aby zapewnić ten sam kod skrótu.
- Wspólne użycie `equals()` i `hashCode()` umożliwia efektywne zarządzanie identycznymi obiektami w strukturach danych typu hash.
equals()
equals() porównuje zawartość obiektów. Jest to często nazywane porównaniem równości i jeśli nie zastąpisz equals(), wewnętrznie jest równe ==, co oznacza, że jest to porównanie identyczności. Dlatego, jeśli chcesz poprawnie porównać obiekt pod kątem równości, musisz użyć equals().
public boolean equals(Object obj) {
return (this == obj);
hashCode()
hashCode() sprawdza, czy dwa obiekty są tym samym obiektem. Wykonuje to samo porównanie identyczności, co ==, ale metoda hashCode() zwraca jako wartość zwrotną unikalną wartość całkowitą obiektu w czasie wykonywania. Zazwyczaj zwraca adres pamięci obiektu zapisanego w stercie.
Ta metoda ma dołączone słowo kluczowe native, co oznacza, że jest używane w przypadku korzystania z języka zaprogramowanego w innym języku niż Java w Javie.
Czym jest hashowanie?
Hashowanie to proces tworzenia stałej wielkości wartości wyjściowej z zmiennej wielkości wartości wejściowej przy użyciu funkcji skrótu. Wartość uzyskaną przez hashowanie nazywana jest kodem skrótu.
equals() i hashCode()
Ponieważ ten sam obiekt musi mieć ten sam adres pamięci, oczywiste jest, że ten sam obiekt musi mieć ten sam kod skrótu. Dlatego zaleca się zaprogramowanie kodu tak, aby zapewnić ten sam kod skrótu, zastępując nie tylko equals(), ale także hashCode().
Struktura danych skrótu
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);
}
Dodajmy dwa równe obiekty do struktury danych HashSet. Jeśli wydrukujemy rozmiar tego zbioru, otrzymamy 2. Dlaczego tak?
Dzieje się tak dlatego, że struktury danych wykorzystujące skrótowanie używają hashCode() do określenia klucza. Oznacza to, że przed porównaniem obiektów pod kątem równości porównywane są ich kody skrótu, a następnie określa się, czy obiekt jest równy. Jeśli hashCode() nie zostanie zastąpione, zostanie użyte hashCode() z obiektu, co zwróci adres pamięci, pod którym zapisany jest każdy obiekt. Dlatego w przypadku korzystania ze struktur danych skrótu, oprócz equals(), zaleca się również zastąpienie hashCode().
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);
}
Źródła
Przewidywane pytania i odpowiedzi na rozmowę kwalifikacyjną
Dlaczego equals() i hashCode() są używane razem?
Dzieje się tak dlatego, że struktury danych wykorzystujące skrótowanie używają hashCode() do określenia klucza. Oznacza to, że przed porównaniem obiektów pod kątem równości porównywane są ich kody skrótu, a następnie określa się, czy obiekt jest równy. Jeśli hashCode() nie zostanie zastąpione, zostanie użyte hashCode() z obiektu, co zwróci adres pamięci, pod którym zapisany jest każdy obiekt. Dlatego w przypadku korzystania ze struktur danych skrótu, oprócz equals(), zaleca się również zastąpienie hashCode().