Sobes.tech
Junior

Τι κάνει η μέθοδος 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 κ.λπ.
}