Sobes.tech
Middle

Neden hashCode metodları ve == karşılaştırma operatörü yeniden tanımlanıyor?

sobes.tech yapay zeka

AI'dan gelen yanıt

hashCode ve == operatörünün yeniden tanımlanması (nesneleri değerlerine göre, referansa değil) HashSet ve HashMap gibi karma tabanlı koleksiyonların doğru çalışması için gereklidir.

  • == operatörü: İki nesnenin eşit sayılma durumunu belirler. Varsayılan olarak, nesnelerin referanslarını karşılaştırır. Yeniden tanımlayarak, nesnenin içeriğine veya özniteliklerine göre karşılaştırma mantığını uygularız.
  • hashCode metodu: Nesne için tam sayı değeri (hash kodu) döner. Eğer iki nesne == ile eşitse, hashCode değerleri aynı olmalıdır. Tersine, iki nesne aynı hashCode'a sahip olabilir, ama eşit olmayabilir.

Bu sözleşmenin ihlali (eşit nesnelerin farklı hashCode'lara sahip olması), karma tabanlı koleksiyonların düzgün çalışmamasına yol açar: elemanlar tekrar tekrar eklenebilir (HashSet), veya bulunamayabilir (HashMap).

Örnek:

class Person {
  final String name;
  final int age;

  Person(this.name, this.age);

  @override
  bool operator ==(Object other) {
    // Diğer nesnenin Person olup olmadığını kontrol et
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    // Öznitelikleri karşılaştır
    return other is Person && name == other.name && age == other.age;
  }

  @override
  int get hashCode => Object.hash(name, age); // Özniteliklerden hash oluştur
}

void main() {
  final p1 = Person('Alice', 30);
  final p2 = Person('Alice', 30);
  final p3 = Person('Bob', 25);

  print(p1 == p2); // true (değer karşılaştırması, yeniden tanımlamadan sonra)
  print(p1 == p3); // false

  final peopleSet = {p1};
  print(peopleSet.contains(p2)); // true (hash ve karşılaştırma ile arama)
}