Τι κάνει η μέθοδος equals() στην Java;
sobes.tech AI
Απάντηση από AI
Η μέθοδος equals() στη Java χρησιμοποιείται για τη σύγκριση δύο αντικειμένων ως προς την ισότητα. Από προεπιλογή, στην περίπτωση αντικειμένων που κληρονομούν από το Object χωρίς να την υπερκαλύπτουν, συγκρίνει τις αναφορές των αντικειμένων (==), δηλαδή ελέγχει αν οι μεταβλητές δείχνουν στην ίδια περιοχή μνήμης.
Η σωστή υπερκατασκευή της μεθόδου equals() είναι σημαντική για τη σύγκριση αντικειμένων βάσει του περιεχομένου τους, και όχι βάσει της τοποθεσίας τους στη μνήμη.
Κατά την υπερκατασκευή της equals(), πρέπει να ακολουθούνται οι ακόλουθοι κανόνες:
- Αντανάκλαση: για κάθε μη μηδενικό αντικείμενο
x, τοx.equals(x)πρέπει να επιστρέφειtrue. - Συμμετρία: για κάθε μη μηδενικό αντικείμενο
xκαιy, αν τοx.equals(y)επιστρέφειtrue, τότε και τοy.equals(x)πρέπει να επιστρέφειtrue. - Transitivity: για κάθε μη μηδενικό αντικείμενο
x,yκαιz, αν τοx.equals(y)και τοy.equals(z)επιστρέφουνtrue, τότε και τοx.equals(z)πρέπει να επιστρέφειtrue. - Συνέπεια: για κάθε μη μηδενικό αντικείμενο
xκαιy, πολλαπλές κλήσεις τουx.equals(y)πρέπει να επιστρέφουν το ίδιο αποτέλεσμα, εφόσον οι πληροφορίες που χρησιμοποιούνται για τη σύγκριση δεν αλλάζουν. - Για κάθε μη μηδενικό αντικείμενο
x, τοx.equals(null)πρέπει να επιστρέφειfalse.
Κατά κανόνα, κατά την υπερκατασκευή της equals(), πρέπει επίσης να υπερκατασκευάσετε τη μέθοδο hashCode(), διατηρώντας τον συμβόλαιο: αν δύο αντικείμενα είναι ίσα σύμφωνα με το equals(), οι κωδικοί hash που επιστρέφονται από το hashCode() πρέπει να είναι ίδιοι. Το αντίθετο δεν είναι υποχρεωτικό: αν οι κωδικοί hash είναι ίδιοι, τα αντικείμενα δεν είναι απαραίτητα ίσα.
Παράδειγμα υπερκατασκευής:
public class MyObject {
private int value;
private String name;
public MyObject(int value, String name) {
this.value = value;
this.name = name;
}
@Override
public boolean equals(Object o) {
// Η σύγκριση
if (this == o) return true;
// Έλεγχος null και τύπου αντικειμένου
if (o == null || getClass() != o.getClass()) return false;
// Μετατροπή τύπου και σύγκριση πεδίων
MyObject myObject = (MyObject) o;
return value == myObject.value &&
Objects.equals(name, myObject.name);
}
@Override
public int hashCode() {
// Δημιουργία κωδικού hash βάσει πεδίων
return Objects.hash(value, name);
}
// getters, setters κ.λπ.
}