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'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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ public class CrunchifyLogicalVsReferenceEqality { public static void main ( String [ ] args ) { String strA = new String ( "eBay" ) ; String strB = new String ( "eBay" ) ; String strC = new String ( "Paypal" ) ; // Create a String reference and assign an existing String's reference to it // so that both references point to the same String object in memory. String strD = strA ; // Print out the results of various equality checks // Reference Equality System . out . println ( "Reference Equality Result:" ) ; System . out . println ( strA == strB ) ; System . out . println ( strA == strC ) ; System . out . println ( strA == strD ) ; // Logical Equality System . out . println ( "\nLogical Equality Result:" ) ; System . out . println ( strA . equals ( strB ) ) ; System . out . println ( strA . equals ( strC ) ) ; System . out . println ( strA . equals ( strD ) ) ; } } |
Çıktı:
1 2 3 4 5 6 7 8 9 |
Reference Equality Result : false false true Logical Equality Result : true false true |
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ıklaequals
vehashCode
çı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ürFloat.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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/ reflexive property assertTrue ( a . equals ( a ) ) ; // symmetric property assertTrue ( a . equals ( b ) == b . equals ( a ) ) ; // transitive property if ( a . equals ( b ) && b.equals(c) ) { assertTrue( a.equals(c) ); } // consistency property assertTrue ( a . equals ( b ) == a . equals ( b ) ) ; // non-null property assertFalse ( a . equals ( null ) ) ; |
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
package crunchify . com . tutorials ; /** * * @author Crunchify.com * How to Override equals() method in Java? * How to Override hasCode() method in Java? * version:1.2 * */ public class CrunchifyImplementEqualsHashCode { public static void main ( String [ ] args ) { CrunchifyImplementEqualsHashCode crunchifyTest = new CrunchifyImplementEqualsHashCode ( ) ; Crunchify one = new Crunchify ( 1 ) ; Crunchify two = new Crunchify ( 1 ) ; crunchifyTest . test1 ( one , two ) ; Crunchify three = new Crunchify ( 1 ) ; Crunchify four = new Crunchify ( 2 ) ; crunchifyTest . test2 ( three , four ) ; } public void test1 ( Crunchify one , Crunchify two ) { if ( one . equals ( two ) ) { System . out . println ( "Test1: One and Two are equal" ) ; } else { System . out . println ( "Test1: One and Two are not equal" ) ; } } public void test2 ( Crunchify three , Crunchify four ) { if ( three . equals ( four ) ) { System . out . println ( "Test2: Three and Four are equal" ) ; } else { System . out . println ( "Test2: Three and Four are not equal" ) ; } } } class Crunchify { private int value ; Crunchify ( int val ) { value = val ; } public int getValue ( ) { return value ; } // The method does override or implement a method declared in a supertype. @Override public boolean equals ( Object o ) { // null check if ( o == null ) { return false ; } // this instance check if ( this == o ) { return true ; } // instanceof Check and actual value check if ( ( o instanceof Crunchify ) && (((Crunchify) o).getValue() == this.value)) { return true; } else { return false ; } } @Override public int hashCode ( ) { int result = 0 ; result = ( int ) ( value / 11 ) ; return result ; } } |
Eclipse Konsol Çıktısı:
1 2 |
Test1 : One and Two are equal Test2 : Three and Four are not equal |