Java Collections – hashCode() dan equals() – Bagaimana Mengganti Metode equals() dan hashcode() di Java?
Diterbitkan: 2018-08-08
equals()
dan hashCode()
di Java adalah dua metode dasar yang dideklarasikan di kelas Object dan sebagian atau inti Java library.
Jika Anda memiliki salah satu dari masalah di bawah ini di Jawa maka Anda berada di tempat yang tepat.
- Praktik Java -> Menerapkan persamaan
- override – Mengganti persamaan dan kode hash di Java
- Cara mengganti metode equals() di java
- Cara mengganti metode hashCode() di java
- Bagaimana cara mengganti metode equals dan hashCode di Java
- Bagaimana dan Mengapa Mengganti Metode yang sama di Java
- Mengapa selalu menimpa kode hash() jika menimpa equals()?
Mari kita lihat contoh sederhana untuk memahami terlebih dahulu Reference Equality
Logical Equality
. Operator kesetaraan (==) membandingkan referensi (alamat dalam memori) dari dua String sebagai dua angka yang berbeda - ini dikenal sebagai Reference equality
.
Logical equality
membandingkan data objek alih-alih nilai referensi.
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 ) ) ; } } |
Keluaran:
1 2 3 4 5 6 7 8 9 |
Reference Equality Result : false false true Logical Equality Result : true false true |
hashCode dan equals terkait erat:
- jika Anda mengganti equals , Anda harus mengganti hashCode .
- kode hash harus menghasilkan nilai yang sama untuk objek yang sama.
- equals dan hashCode harus bergantung pada
same set of significant fields
. Anda harus menggunakan kumpulan bidang yang sama di kedua metode ini. Anda tidak diharuskan untuk menggunakan semua bidang. Misalnya, bidang terhitung yang bergantung pada orang lain kemungkinan besar harus dihilangkan dariequals
danhashCode
.
Saat menerapkan equals , bidang dibandingkan secara berbeda, menurut jenisnya:
- bidang objek, termasuk koleksi: gunakan equals
- enumerasi tipe-aman : gunakan sama dengan atau == (jumlahnya sama, dalam hal ini)
- bidang objek mungkin-null : gunakan keduanya == dan sama dengan
- bidang array : gunakan
Arrays.equals
- bidang primitif selain float atau double : gunakan ==
-
float
: konversi ke int menggunakanFloat.floatToIntBits ,
lalu gunakan == -
double
: konversi ke long menggunakanDouble.doubleToLongBits
, lalu gunakan ==
Menerapkan kode hash :
- jika kelas menimpa equals , itu harus menimpa kode hash
- ketika keduanya diganti, equals dan hashCode harus menggunakan kumpulan bidang yang sama
- jika dua objek sama, maka nilai kode hashnya juga harus sama
- jika objek tidak dapat diubah, maka kode hash adalah kandidat untuk caching dan inisialisasi malas
Ini adalah kesalahpahaman populer bahwa kode hash menyediakan pengidentifikasi unik untuk suatu objek. Itu tidak.
Dengan kontrak umum, metode equals()
di Java harus refleksif, simetris, transitif, konsisten, dan referensi non-null harus menghasilkan false. Dengan kata lain, untuk nilai sembarang dari a, b, dan c, pengujian berikut harus selalu lulus:
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 ) ) ; |
Untuk Praktik terbaik, gunakan langkah-langkah di bawah ini untuk mengimplementasikan metode equals() Anda:
- Gunakan ini == itu untuk memeriksa kesetaraan referensi
- Gunakan
instanceof
untuk menguji tipe argumen yang benar - Berikan argumen ke jenis yang benar
- Bandingkan bidang yang signifikan untuk kesetaraan
Berikut adalah Contoh Lengkap.
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 ; } } |
Keluaran Konsol Eclipse:
1 2 |
Test1 : One and Two are equal Test2 : Three and Four are not equal |