Java Koleksiyonları – hashCode() ve equals() – Java'da equals() ve hashcode() Yöntemi nasıl geçersiz kılınır?

Yayınlanan: 2018-08-08
Java Koleksiyonları hashCode ve eşittir

Java'daki equals() ve hashCode() , Object sınıfında ve Java'nın parça veya çekirdek kitaplığında bildirilen iki temel yöntemdir.

Java ile ilgili aşağıdaki endişelerden herhangi birine sahipseniz, doğru yerdesiniz.

  • Java Uygulamaları -> Eşitleri uygulamak
  • geçersiz kılma - Java'da eşittir ve hashCode'u geçersiz kılma
  • Java'da equals() yöntemi nasıl geçersiz kılınır
  • Java'da hashCode() yöntemi nasıl geçersiz kılınır
  • Java'da eşittir ve hashCode yöntemi nasıl geçersiz kılınır
  • Java'da eşittir Yöntemi Nasıl ve Neden Geçersiz Kılınmalı
  • Geçersiz kılmak eşittir() ise neden her zaman hashcode() öğesini geçersiz kılalım?

İlk Reference Equality ve Logical Equality anlamak için basit bir örneğe bakalım. Eşitlik operatörü (==), iki Dizenin referanslarını (bellekteki adresleri) iki farklı sayı olarak karşılaştırır - bu, Reference equality olarak bilinir.

Logical equality , referansların değeri yerine nesnelerin verilerini karşılaştırır.

Çıktı:

hashCode ve equals yakından ilişkilidir:

  • eşittir geçersiz kılarsanız, hashCode'u geçersiz kılmalısınız.
  • hashCode , eşit nesneler için eşit değerler üretmelidir.
  • eşittir ve hashCode , same set of significant fields bağlı olmalıdır. Bu yöntemlerin her ikisinde de aynı alan grubunu kullanmalısınız. Tüm alanları kullanmak zorunda değilsiniz. Örneğin, diğerlerine bağlı olan hesaplanmış bir alan, büyük olasılıkla equals ve hashCode çıkarılmalıdır.

equals uygulanırken alanlar türlerine göre farklı şekilde karşılaştırılır:

  • koleksiyonlar dahil nesne alanları: eşittir
  • tip güvenli numaralandırmalar: eşittir veya == kullanın (bu durumda aynı anlama gelirler)
  • muhtemelen boş nesne alanları: hem == hem de eşittir
  • dizi alanları: Arrays.equals kullanın
  • float veya double dışındaki ilkel alanlar: == kullanın
  • float : kullanarak int'ye dönüştür Float.floatToIntBits , ardından == kullanın
  • double : Double.doubleToLongBits kullanarak uzuna dönüştürün, ardından == kullanın

hashCode'u uygulamak:

  • bir sınıf eşittir öğesini geçersiz kılarsa, hashCode öğesini geçersiz kılmalıdır
  • ikisi de geçersiz kılındığında, equals ve hashCode aynı alan grubunu kullanmalıdır
  • iki nesne eşitse, hashCode değerleri de eşit olmalıdır
  • nesne değişmezse, hashCode önbelleğe alma ve tembel başlatma için bir adaydır

hashCode'un bir nesne için benzersiz bir tanımlayıcı sağladığı yaygın bir yanılgıdır. O değil.

Genel sözleşmeye göre, Java'daki equals() yöntemi dönüşlü, simetrik, geçişli, tutarlı olmalı ve boş olmayan herhangi bir başvuru false döndürmelidir. Başka bir deyişle, a, b ve c'nin keyfi değerleri için aşağıdaki testler her zaman geçmelidir:

En iyi uygulama için, equals() yönteminizi uygulamak için aşağıdaki adımları kullanın:

  • Referans eşitliğini kontrol etmek için bunu == kullanın
  • Doğru bağımsız değişken türünü test etmek için instanceof kullanın
  • Argümanı doğru türe yayın
  • Eşitlik için önemli alanları karşılaştırın

İşte Tam Bir Örnek.

CrunchifyImplementEqualsHashCode.java

Eclipse Konsol Çıktısı: