equals() metodu, iki nesnenin "eşit" olup olmadığını tanımlar. Varsayılan olarak, referansları karşılaştırır (yani ==), ancak sık sık sınıfların (örneğin, varlıklar, değer nesneleri) veriler üzerinde mantıksal karşılaştırma gerektirir.
Ne zaman yeniden yazılmalı:
Gereklilikler:
Örnek:
public class Person { private String email; @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(email, person.email); } @Override public int hashCode() { return Objects.hash(email); } }
Eğer iki nesne equals() ile eşitse, hashCode() her zaman aynı mı olmalıdır?
Cevap: Evet! Bu, Java'nın sözleşimlerindeki bir gerekliliktir. Ancak tam tersi yanlıştır: Aynı hashCode'a sahip iki nesne equals() ile eşit olmayabilir — hash kodları farklı nesneler için çakışabilir (çakışmalar).
Hata örneği:
person1.equals(person2); // true person1.hashCode() != person2.hashCode(); // Hata!
Hikaye
Kurumsal bir uygulamada Kullanıcı varlığı bir HashSet'e eklendi. Equals yeniden yazılmış, hashCode — yazılmamıştı. Equals'ı etkileyen alanların değiştirilmesinden sonra, HashSet bu nesneyi "kaybetti": contains metodu aynı veriler için false döndürdü.
Hikaye
IoT projesinde, varlıklar geçici olarak yalnızca id ile karşılaştırıldı, ardından mantık, ismi dikkate alacak şekilde equals'a değiştirildi. HashMap tahmin edilemez bir şekilde davrandı, anahtarlar güncellenirken kopyalar oluştu — equals/hashCode sözleşmesi, uygulama sürümlerinin karıştırılması nedeniyle ihlal edildi.
Hikaye
Siparişleri karşılaştırmak için API yazarken, iki farklı sınıf kendi equals yöntemini uygular; bunlardan biri getClass() çağırırken, diğeri instanceof kullanıyordu. Bu, siparişlerin asimetrik bir şekilde karşılaştırılmasına ve koleksiyonlar ile iş mantığında hatalara yol açtı.