Neden Java equals ve hashCode yöntemleri geçersiz kılmak gerekir mi?
Son zamanlarda bu okudum
Developer Works Document. Belge etkin ve doğru hashCode()
equals()
tanımlama ile ilgilidir ama bu iki yöntem geçersiz kılmak için neden gerekli olduğunu anlamaya muktedir değilim.
Nasıl bu yöntem etkin bir şekilde uygulamaya karar verebilir miyim?
CEVAP
Her zaman gerekli hashcode ve equals geçersiz kılmak değildir. Ama eğer bir geçersiz kılmak gerekir düşünüyorsanız, o zaman her ikisi de geçersiz kılmak gerekir. Hadi biz bir geçersiz kılma ama diğer durum olurdu. ne analiz ve Map
kullanmak için çalışıyoruz.
Böyle bir sınıf var ve MyClass
iki nesne importantField
eşittir kendi halinde eşit hashCode
equals
eclipse tarafından oluşturulan () olduğunu söylüyor
public class MyClass {
private final String importantField;
private final String anotherField;
public MyClass(final String equalField, final String anotherField) {
this.importantField = equalField;
this.anotherField = anotherField;
}
public String getEqualField() {
return importantField;
}
public String getAnotherField() {
return anotherField;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
((importantField == null) ? 0 : importantField.hashCode());
return result;
}
@Override
public boolean equals(final Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
final MyClass other = (MyClass) obj;
if (importantField == null) {
if (other.importantField != null)
return false;
} else if (!importantField.equals(other.importantField))
return false;
return true;
}
}
Sadece hashCode
geçersiz kılar
Bu var düşünün
MyClass first = new MyClass("a","first");
MyClass second = new MyClass("a","second");
Sadece myMap.put(first,someValue)
çağırdığınızda hashCode
sonra geçersiz kılma ilk alır, hesaplar belirli bir kova hashCode
ve depolar. Sonra myMap.put(second,someOtherValue)
çağırdığınızda eşit (bizim tanımımıza göre) çünkü Map Documentation başı olarak ikinci ile ilk değiştirmelisiniz.
Ama sorun şu ki eşit değildi yeniden, o zaman göster karma second
ve yineler kova isteyen varsa bir nesne k
second.equals(k)
doğru olmayacaktır bulacaksınız herhangi second.equals(first)
false
.
Sadece equals
geçersiz kılar
Eğer sadece equals
geçersiz, o zaman sana haber myMap.put(first,someValue)
ilk olacak karma için bazı kova ve arama myMap.put(second,someOtherValue)
olacak karma için başka bir kova (da farklı bir hashCode
). Aynı kova karma yok gibi eşit oldukları halde,,, harita ve ikisi de göster kalmak fark edemez.
Açıktı umuyoruz
Neden't statik Java yöntemleri ge...
'Eclipse içine bir proje aldıktan...
Neden Java'In hashCode() Dize çar...
Neden bu Java programı görünüşte rağme...
Neden &; son" Java 8 arabirim yön...