@Lombo'nun cevabına ekleme
Eşittir () ne zaman geçersiz kılmanız gerekir?
Object equals () öğesinin varsayılan uygulaması:
public boolean equals(Object obj) {
return (this == obj);
}
Bu, iki nesnenin yalnızca aynı bellek adresine sahip olmaları durumunda eşit kabul edileceği anlamına gelir; bu, yalnızca bir nesneyi kendisiyle karşılaştırmanız durumunda geçerli olacaktır.
Ancak, özelliklerinden biri veya daha fazlası için aynı değere sahiplerse, iki nesneyi aynı olarak değerlendirmek isteyebilirsiniz (@Lombo'nun cevabında verilen örneğe bakın).
Böylece equals()
bu durumlarda geçersiz kılacaksınız ve eşitlik için kendi koşullarınızı vereceksiniz.
Eşittir () başarıyla uyguladım ve harika çalışıyor.Yani neden hashCode () geçersiz kılmak istiyorlar?
Kullanıcı tanımlı sınıfınızda "Hash" tabanlı Koleksiyonlar kullanmadığınız sürece sorun yok . Ama isteyebilirsiniz Gelecekte bir zamanda kullanmak HashMap
veya HashSet
sen değil yoksa override
ve hashCode () "doğru uygulamak" , bu Hash tabanlı tahsilat amaçlı değildir çalışması gibi.
Yalnızca geçersiz kılmaya eşittir (@Lombo'nun cevabına ek olarak)
myMap.put(first,someValue)
myMap.contains(second); --> But it should be the same since the key are the same.But returns false!!! How?
Her şeyden önce, HashMap hashCode second
öğesinin aynı olup olmadığını kontrol eder first
. Yalnızca değerler aynı ise, aynı gruptaki eşitliği kontrol etmeye devam eder.
Ancak burada hashCode bu 2 nesne için farklıdır (çünkü varsayılan uygulamadan farklı bellek adresleri vardır). Dolayısıyla eşitliği kontrol etmek bile umursamaz.
Geçersiz kılınmış equals () yönteminizin içinde bir kesme noktanız varsa, farklı hashCodes'ları varsa içeri girmez.
contains()
kontrol eder hashCode()
ve yalnızca aynı olmaları durumunda equals()
yönteminizi çağırır .
Neden HashMap'in tüm kovalarda eşitliği kontrol etmesini sağlayamıyoruz? Bu yüzden hashCode () geçersiz kılmama gerek yok !!
O zaman Hash tabanlı koleksiyonların noktasını kaçırıyorsunuz. Aşağıdakileri göz önünde bulundur :
Your hashCode() implementation : intObject%9.
Aşağıdakiler, kova şeklinde saklanan anahtarlardır.
Bucket 1 : 1,10,19,... (in thousands)
Bucket 2 : 2,20,29...
Bucket 3 : 3,21,30,...
...
Diyelim ki, haritanın 10 anahtarını içerip içermediğini bilmek istiyorsunuz. Tüm bölümleri aramak ister misiniz? veya Yalnızca bir grup aramak ister misiniz?
HashCode'a dayanarak, 10 varsa, Bucket 1'de mevcut olması gerektiğini belirlersiniz. Bu yüzden yalnızca Bucket 1 aranacaktır !!