Sobes.tech
Junior

Τι κάνει η μέθοδος equals() στην Java;

sobes.tech AI

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

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

Ωστόσο, οι περισσότερες κλάσεις στη Java (π.χ., String, Integer) επαναπροσδιορίζουν αυτή τη μέθοδο για να συγκρίνουν τις τιμές που περιέχονται στα αντικείμενα, και όχι τις αναφορές τους.

Όταν επαναπροσδιορίζετε το equals(), είναι σημαντικό να ακολουθείτε τον συμβόλαιό του:

  • Αντανάκλαση: x.equals(x) πρέπει να είναι true για κάθε x που δεν είναι null.
  • Συμμετρία: x.equals(y) πρέπει να είναι true αν και μόνο αν y.equals(x) είναι true, για κάθε x και y που δεν είναι null.
  • Μεταβιβαστικότητα: Αν x.equals(y) και y.equals(z) είναι true, τότε και x.equals(z) πρέπει να είναι true, για κάθε x, y, z που δεν είναι null.
  • Συνέπεια: Πολλαπλές κλήσεις του x.equals(y) πρέπει να επιστρέφουν το ίδιο αποτέλεσμα, εφόσον τα αντικείμενα δεν έχουν αλλάξει.
  • **Για κάθε x που δεν είναι null, το x.equals(null) πρέπει να είναι false.

Παράδειγμα επαναπροσδιορισμού του equals():

class MyObject {
    private int value;

    public MyObject(int value) {
        this.value = value;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        MyObject myObject = (MyObject) obj;
        return value == myObject.value;
    }
}

Χρήση του equals():

// Σύγκριση με αναφορά (προεπιλογή στη `Object`)
Object obj1 = new Object();
Object obj2 = new Object();
boolean μεΑναφορά = obj1.equals(obj2); // false

// Σύγκριση με τιμή (μετά την επαναπροσδιορισμό του `equals`)
MyObject myObj1 = new MyObject(10);
MyObject myObj2 = new MyObject(10);
boolean μεΤιμή = myObj1.equals(myObj2); // true

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