memahami
Tujuan hashCode () adalah untuk mendapatkan kode hash, juga dikenal sebagai kode hash; Ini sebenarnya mengembalikan integer int. Fungsi kode hash ini adalah untuk menentukan posisi indeks objek dalam tabel hash.
HashCode () didefinisikan dalam objek JDK.java, yang berarti bahwa kelas mana pun di Java berisi fungsi hashcode ().
Meskipun, setiap kelas Java berisi fungsi hashcode (). Namun, kode hashcode () dari kelas hanya berguna saat membuat dan membuat "tabel hash" (lihat deskripsi di bawah ini untuk "tabel hash") (fungsinya adalah untuk menentukan posisi setiap objek kelas dalam tabel hash; dalam kasus lain (misalnya, membuat satu objek kelas, atau membuat array yang memiliki objek kelas, dll.
Daftar hash di atas mengacu pada: kelas -kelas dalam koleksi Java yang pada dasarnya adalah daftar hash, seperti hashmap, hashtable, dan hashset.
Dengan kata lain: HashCode () hanya berguna dalam daftar hashlist, tetapi tidak berguna dalam kasus lain. Fungsi hashCode () dalam tabel hash adalah untuk mendapatkan kode hash objek, dan kemudian menentukan posisi objek dalam tabel hash.
Kita semua tahu bahwa tabel hash menyimpan pasangan nilai kunci, yang ditandai oleh: dapat dengan cepat mengambil "nilai" yang sesuai berdasarkan "kunci". Ini menggunakan kode hash!
Inti dari tabel hash diimplementasikan melalui array. Ketika kami ingin mendapatkan "nilai" tertentu dalam tabel hash, kami sebenarnya ingin mendapatkan elemen pada posisi tertentu dalam array. Posisi array diperoleh dengan "kunci"; Selain itu, posisi array dihitung dengan kode hash yang sesuai dengan "kunci".
Di bawah ini, kami akan mengambil hashset sebagai contoh untuk menjelaskan secara mendalam peran hashcode ().
Misalkan sudah ada 1000 elemen di hashset. Apa yang harus saya lakukan saat memasukkan elemen ke -1001? Karena Hashset adalah koleksi set, memungkinkan untuk elemen duplikat.
"Bandingkan elemen ke -1001 satu dengan satu dengan 1000 elemen sebelumnya"? Jelas, efisiensi ini sama -sama tidak efisien. Tabel hash memecahkan masalah ini dengan sangat baik. Ini menghitung posisi elemen dalam tabel hash berdasarkan kode hash, dan kemudian memasukkan elemen ke posisi itu. Untuk elemen yang sama, secara alami, hanya satu yang disimpan.
Dari sini kita dapat melihat bahwa jika dua elemen sama, kode hash mereka harus sama; Tapi sebaliknya tidak. Di meja hash,
1. Jika dua objek sama, maka nilai hashcode () mereka harus sama;
2. Jika kedua objek hashCode () sama, mereka tidak harus sama.
Catatan: Ini adalah kasus di tabel hash. Ini pasti benar dalam daftar non hash!
Contoh
Mari kita lihat contoh spesifik.
kelas publik hashtest {private int i; publik int geti () {return i; } public void seti (int i) {this.i = i; } public int hashCode () {return i % 10; } public final static void main (string [] args) {hashtest a = new hashtest (); Hashtest b = hashtest baru (); a.seti (1); b.seti (1); Set <shashtest> set = hashset baru <Hashtest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == B.HashCode ()); System.out.println (A.Equals (b)); System.out.println (set); }}Hasil output ini:
True False [com.ubs.sae.test.hashtest@1, com.ubs.sae.test.hashtest@1]
Dalam contoh di atas, kami baru saja menulis ulang metode kode hash. Dari hasil di atas, kita dapat melihat bahwa meskipun kode hash dari kedua objek itu sama, kedua objek itu sebenarnya tidak sama;, kami tidak menulis ulang metode yang sama, dan kemudian kami akan menyebut metode default objek untuk membandingkan apakah referensi dari kedua objek tersebut tidak pasti, dan itu menunjukkan bahwa ini adalah dua objek yang berbeda, dan referensi kedua objek tidak pasti. Di sini kita menempatkan objek yang dihasilkan di hashset, dan hanya objek unik yang dapat disimpan dalam hashset, yaitu, objek yang sama (berlaku untuk metode yang sama) hanya akan menyimpan satu, tetapi di sini, sebenarnya ada dua objek A dan B yang ditempatkan di hashset, jadi hashset kehilangan artinya sendiri.
Saat ini, kami menambahkan metode yang sama:
kelas publik hashtest {private int i; publik int geti () {return i; } public void seti (int i) {this.i = i; } <span style = "warna:#3366ff;"> <strong> public boolean sama (objek objek) {if (objek == null) {return false; } if (object == this) {return true; } if (! (Contoh objek dari hashtest)) {return false; } Hashtest lainnya = (hashtest) objek; if (Other.geti () == this.geti ()) {return true; } return false; } </strong> </span> hashCode int publik () {return i % 10; } public final static void main (string [] args) {hashtest a = new hashtest (); Hashtest b = hashtest baru (); a.seti (1); b.seti (1); Set <shashtest> set = hashset baru <Hashtest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == B.HashCode ()); System.out.println (A.Equals (b)); System.out.println (set); }}Hasil yang diperoleh saat ini adalah sebagai berikut:
True True [com.ubs.sae.test.hashtest@1]
Dari hasilnya, kita dapat melihat bahwa kedua objek sekarang sepenuhnya sama, dan hanya satu objek yang disimpan dalam hashset.
Meringkaskan
1. Keberadaan kode hash terutama digunakan untuk mencari ke belakang, seperti hashtable, hashmap, dll. Kode hash digunakan untuk menentukan alamat penyimpanan suatu objek dalam struktur penyimpanan hash;
2. Jika kedua objeknya sama, itu berlaku untuk metode yang setara (java.lang.Object), maka kode hash dari kedua objek ini harus sama;
3. Jika metode setara objek ditulis ulang, maka kode hash objek juga harus ditulis ulang sebanyak mungkin, dan objek yang digunakan oleh kode hash harus konsisten dengan sama dengan metode yang setara, jika tidak, ia akan melanggar poin kedua yang disebutkan di atas;
4. Kode hash dari dua objek adalah sama, yang tidak berarti bahwa kedua objek tersebut sama, yaitu, tidak harus berlaku untuk metode yang setara (java.lang.Object). Ini hanya dapat menunjukkan bahwa kedua objek ini berada dalam struktur penyimpanan hash, seperti hashtable, dan mereka "disimpan dalam keranjang yang sama."