Sobes.tech
Middle

Μίλησε για τις συμβάσεις των μεθόδων equals και hashCode στη Java.

sobes.tech AI

Απάντηση από AI

  • Αντανάκλαση: για οποιαδήποτε μη μηδενική αναφορική τιμή x, το x.equals(x) πρέπει να επιστρέφει true.

  • Συμμετρία: για οποιαδήποτε μη μηδενική αναφορική τιμή x και y, το x.equals(y) πρέπει να επιστρέφει true αν και μόνο αν το y.equals(x) επιστρέφει true.

  • Μεταθετικότητα: για οποιαδήποτε τριάδα μη μηδενικών αναφορικών τιμών x, y και z, αν το x.equals(y) επιστρέφει true και το y.equals(z) επιστρέφει true, τότε το x.equals(z) πρέπει επίσης να επιστρέφει true.

  • Συνεπτικότητα: για οποιαδήποτε μη μηδενική αναφορική τιμή x και y, οι πολλαπλές κλήσεις της μεθόδου x.equals(y) πρέπει να επιστρέφουν σταθερά true ή σταθερά false, υπό την προϋπόθεση ότι καμία πληροφορία που χρησιμοποιείται στις συγκρίσεις equals των αντικειμένων δεν αλλάζει μεταξύ των κλήσεων.

  • Για οποιαδήποτε μη μηδενική αναφορική τιμή x, το x.equals(null) πρέπει να επιστρέφει false.

  • Αν δύο αντικείμενα είναι ίσα σύμφωνα με τη μέθοδο equals(Object), τότε η κλήση της μεθόδου hashCode και για τα δύο αντικείμενα πρέπει να δίνει την ίδια ακέραια τιμή.

  • Δεν απαιτείται να δίνει διαφορετικές ακέραιες τιμές η hashCode για αντικείμενα που δεν είναι ίσα σύμφωνα με τη μέθοδο equals(java.lang.Object). Ωστόσο, ο προγραμματιστής πρέπει να κατανοεί ότι η δημιουργία διαφορετικών κωδικών κατακερματισμού για αντικείμενα που δεν είναι ίσα μπορεί να βελτιώσει την απόδοση των κατακερματιστικών πινάκων.

Είναι σημαντικό να υπερκαλύπτονται και οι δύο μέθοδοι equals και hashCode αν υπερκαλύπτεται η μία, για να διατηρηθεί η σύμβαση. Η χρήση του equals χωρίς υπερκαλύψεις του hashCode μπορεί να οδηγήσει σε λανθασμένη λειτουργία συλλογών που βασίζονται σε κατακερματισμό (π.χ., HashMap, HashSet).

public class Person {
    private String name;
    private 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; // Έλεγχος null και τύπου
        Person person = (Person) o;
        return age == person.age &&
               Objects.equals(name, person.name); // Σύγκριση περιεχομένου
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age); // Δημιουργία hash βάσει πεδίων
    }
}