Sobes.tech
Junior — Middle

HashSet'e aynı nesneleri eklerken neden hashCode ve equals metodlarını geçersiz kılmak gerekir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Java'da HashSet, öğeleri depolamak için bir karma tablo kullanır. İki nesnenin aynı olup olmadığını doğru şekilde belirlemek ve yinelenenleri önlemek için HashSet, hashCode() ve equals() yöntemlerine dayanır.

  • hashCode() yöntemi, nesnenin karma kodunu hesaplar ve bu, nesnenin hangi "sepet" (bucket) içine yerleştirileceğini belirler.
  • equals() yöntemi, iki nesneyi karşılaştırarak eşit olup olmadıklarını kontrol eder.

Eğer bu yöntemleri kendi sınıfınızda geçersiz kılmazsanız, Object sınıfının uygulaması kullanılır ve bu, nesneleri referanslarına göre karşılaştırır (yani, aynı veriye sahip iki farklı nesne farklı kabul edilir).

Bu nedenle, HashSet'in aynı nesneleri doğru şekilde tanıyıp yinelenenleri engellemesi için, hashCode() ve equals() yöntemlerini nesnenin önemli alanlarını dikkate alacak şekilde geçersiz kılmanız gerekir.

Örnek:

@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);
}

Bunu yapmadan, HashSet aynı veriye sahip birkaç nesne tutabilir, bu da kümenin mantığını bozar.