Sobes.tech
Junior

Do czego służą metody equals i hashCode w Java?

sobes.tech AI

Odpowiedź od AI

Metody equals i hashCode w Javie służą do poprawnego porównywania obiektów i pracy z kolekcjami opartymi na tablicach haszujących (np. HashMap, HashSet).

  • equals(Object o): Określa, czy bieżący obiekt jest równoważny z innym obiektem. Domyślnie porównuje odwołania do obiektów. Nadpisuje się je, aby porównać stan wewnętrzny obiektów.

  • hashCode(): Zwraca wartość całkowitą (kod haszujący) obiektu. Używany przez kolekcje do szybkiego wyszukiwania elementów. Musi być zgodny z equals: jeśli dwa obiekty są równe według equals, ich kody haszujące muszą być takie same. Twierdzenie odwrotne nie jest prawdziwe.

Nieprawidłowa lub brak nadpisania tych metod może prowadzić do nieprawidłowego zachowania podczas korzystania z obiektów w kolekcjach, takich jak brak obiektu w Set po dodaniu lub niemożność odnalezienia obiektu w HashMap po kluczu.

Przykład nadpisania:

public class MyObject {
    private int id;
    private String name;

    public MyObject(int id, String name) {
        this.id = id;
        this.name = name;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true; // Porównanie referencji
        if (o == null || getClass() != o.getClass()) return false; // Sprawdzenie typu i null

        MyObject that = (MyObject) o; // Rzutowanie

        if (id != that.id) return false; // Porównanie pól
        return name != null ? name.equals(that.name) : that.name == null;
    }

    @Override
    public int hashCode() {
        int result = id; // Obliczanie kodu haszującego na podstawie pól
        result = 31 * result + (name != null ? name.hashCode() : 0);
        return result;
    }
}