Μίλησε για τις συμβάσεις των μεθόδων 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 βάσει πεδίων
}
}