Pertama-tama, untuk memahami peran kode hash, Anda harus mengetahui koleksinya terlebih dahulu di Java.
Secara umum, ada dua jenis koleksi di Java, yang satu adalah Daftar, dan yang lainnya adalah Set.
Tahukah Anda perbedaannya? Unsur-unsur pada himpunan sebelumnya tersusun, dan unsur-unsur tersebut dapat diulang; unsur-unsur pada himpunan terakhir tidak berurutan, tetapi unsur-unsur tersebut tidak dapat diulang.
Jadi, inilah masalah yang lebih serius: Jika Anda ingin memastikan bahwa suatu elemen tidak terulang, apa yang harus menjadi dasar untuk menilai apakah dua elemen terulang?
Ini adalah metode Object.equals. Namun jika dicentang satu kali setiap kali suatu elemen ditambahkan, maka ketika elemennya banyak, jumlah perbandingan antar elemen yang ditambahkan ke koleksi akan sangat banyak.
Dengan kata lain, jika sekarang ada 1000 elemen dalam koleksi, maka ketika elemen ke-1001 ditambahkan ke koleksi, metode sama dengan akan dipanggil 1000 kali. Hal ini jelas akan sangat mengurangi efisiensi.
Oleh karena itu, Java mengadopsi prinsip tabel hash. Hash sebenarnya adalah nama seseorang. Karena dia mengusulkan konsep algoritma hash, maka dinamai menurut namanya.
Algoritme hash, juga dikenal sebagai algoritma hash, secara langsung memberikan data ke suatu alamat sesuai dengan algoritma tertentu. Jika Anda menjelaskan algoritma hash secara detail, maka akan membutuhkan artikel yang lebih panjang, jadi saya tidak akan memperkenalkannya di sini.
Pemula dapat memahami bahwa metode hashCode sebenarnya mengembalikan alamat fisik penyimpanan objek (sebenarnya mungkin tidak demikian).
Dengan cara ini, ketika elemen baru ditambahkan ke koleksi, metode kode hash elemen tersebut dipanggil terlebih dahulu, dan lokasi fisik di mana elemen tersebut harus ditempatkan dapat segera ditemukan.
Jika tidak ada elemen pada posisi ini, dapat langsung disimpan pada posisi ini tanpa perbandingan apa pun;
Panggil saja metode yang sama untuk membandingkannya dengan elemen baru. Jika sama, maka tidak akan disimpan. Jika tidak sama, alamat lain akan di-hash.
Jadi ada masalah resolusi konflik di sini. Dengan cara ini, jumlah panggilan aktual ke metode sama dengan berkurang secara signifikan, hampir hanya sekali atau dua kali.
Oleh karena itu, Java menyediakan ini untuk metode eqauls dan metode hashCode:
1. Jika dua objek sama, maka nilai kode hashnya harus sama; 2. Jika kode hash kedua objek sama, belum tentu sama. Objek yang disebutkan di atas sama mengacu pada perbandingan penggunaan metode eqaul.
Tentu saja Anda tidak harus melakukannya sesuai kebutuhan, tetapi Anda akan menemukan bahwa objek yang sama dapat muncul di koleksi Set. Pada saat yang sama, efisiensi penambahan elemen baru akan sangat berkurang. Metode kode hash digunakan untuk menentukan apakah dua objek sama.
Lalu Anda akan bertanya, bukankah ada metode yang disebut sama dengan? Ya, kedua metode ini digunakan untuk menentukan apakah dua benda itu sama. Tapi mereka berbeda. Secara umum, metode sama dengan dipanggil oleh pengguna. Jika Anda ingin menentukan apakah dua objek sama,
Anda dapat mengganti metode sama dengan dan memanggilnya dalam kode Anda untuk menentukan apakah keduanya sama. Sederhananya, metode sama dengan ini terutama digunakan untuk menentukan apakah dua benda sama dari permukaan atau isinya. Misalnya ada kelas pelajar,
Atributnya hanya nama dan jenis kelamin, jadi kita bisa berpikir bahwa selama nama dan jenis kelaminnya sama, maka kedua objek tersebut juga sama. Metode kode hash umumnya tidak dipanggil oleh pengguna. Misalnya, dalam peta hash, karena kuncinya tidak dapat diulang,
Ketika dia menilai apakah kuncinya diulang, dia menilai metode kode hash, dan juga menggunakan metode yang sama. Apa yang tidak dapat diulang di sini berarti selama salah satu dari yang sama dan kode hash tidak sama, maka akan baik-baik saja! Jadi sederhananya, kode hash setara dengan pengkodean suatu objek, seperti md5 dalam sebuah file. Ini berbeda dari yang sama karena ia mengembalikan tipe int, yang tidak intuitif jika dibandingkan. Kami biasanya menimpa kode hash saat mengganti sama dengan agar logikanya konsisten. Misalnya,
Masih menggunakan contoh tadi, jika nama dan jenis kelaminnya sama, meskipun kedua objeknya sama, maka metode kode hash juga harus mengembalikan nilai kode hash dari nama tersebut ditambah nilai kode hash dari jenis kelaminnya, jadi secara logis keduanya konsisten .
Untuk menentukan secara fisik apakah dua objek sama, cukup gunakan ==