Sobes.tech
Junior — Middle

Γιατί είναι απαραίτητο να υπερισχύσουμε τις μεθόδους hashCode και equals όταν προσθέτουμε ίδιες αντικείμενα σε ένα HashSet;

sobes.tech AI

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

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

  • Η μέθοδος hashCode() υπολογίζει τον κωδικό κατακερματισμού του αντικειμένου, που καθορίζει σε ποιο "καλάθι" (bucket) θα τοποθετηθεί.
  • Η μέθοδος equals() συγκρίνει δύο αντικείμενα για ισότητα.

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

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

Παράδειγμα:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    MyClass myClass = (MyClass) o;
    return field1.equals(myClass.field1) && field2.equals(myClass.field2);
}

@Override
public int hashCode() {
    return Objects.hash(field1, field2);
}

Χωρίς αυτό, το HashSet μπορεί να αποθηκεύσει πολλά αντικείμενα με τα ίδια δεδομένα, κάτι που παραβιάζει τη λογική του συνόλου.