Java selalu menimpa kode hash saat menimpa sama
Baru -baru ini, saya telah mempelajari pengetahuan dasar Java. Ketika saya bertemu Java yang mencakup setara, saya selalu memiliki banyak pertanyaan ketika saya harus menimpa kode hash. Setelah secara langsung mendiskusikan dengan kolega saya dan menanyakan informasi secara online, saya akan mengurutkannya di sini untuk membantu semua orang memahaminya dan ada instruksi dalam kode.
Kode Implementasi Khusus:
Paket cn.xf.cp.ch02.item9; import java.util.hashmap; import java.util.map; phonenumber kelas publik {private final short AreaCode; awalan pendek final pribadi; BUMBUHAN SINGKAT FINAL PRIBADI; Public Phonenumber (Int AreaCode, Int Prefix, Int Linenumber) {RangeCheck (AreaCode, 999, "Kode Area"); rangecheck (awalan, 999, "awalan"); rangecheck (linenumber, 9999, "nomor baris"); this.areacode = (pendek) AreaCode; this.prefix = (pendek) awalan; this.linenumber = (pendek) linenumber; } private static void rangeCheck (int arg, int max, name string) {if (arg <0 || arg> max) melempar baru ilegalargumentException (name + ":" + arg); } @Override public boolean sama (objek o) {if (o == this) return true; if (! (o Contoh dari angka fonen)) mengembalikan false; Fonenumber pn = (fonenumber) o; kembalikan pn.linenumber == linenumber && pn.prefix == prefix && pn.areacode == AreaCode; } /* @Override // Adapun mengapa 31 digunakan, ini adalah nilai yang disarankan. Studi telah menunjukkan bahwa angka ini berkinerja lebih baik saat menggunakan hashCode int publik () {int result = 17; Hasil = 31 * Hasil + AreaCode; Hasil = 31 * Hasil + awalan; Hasil = 31 * Hasil + linenumber; hasil pengembalian; } */// Jika suatu objek tidak sering berubah dan memiliki overhead tinggi, Anda harus mempertimbangkan cache kode hash di dalam objek // variabel yang dimodifikasi dengan volatil, utas akan membaca nilai variabel yang paling dimodifikasi setiap kali menggunakan variabel. Hashcode int volatil swasta; @Override public int hashCode () {int result = hashCode; if (result == 0) {result = 17; Hasil = 31 * Hasil + AreaCode; Hasil = 31 * Hasil + awalan; Hasil = 31 * Hasil + linenumber; HashCode = hasil; } hasil pengembalian; } public static void main (string [] args) {peta <phonenumber, string> m = new HashMap <phonenumber, string> (); M.Put (Bilangan Fonen baru (707, 867, 5309), "Jenny"); // Jenny tidak akan dikembalikan di sini, itu akan mengembalikan null, karena mereka menempatkan objek di bucket hash buckets yang berbeda.out.println (m.get (bilangan fonen baru (707, 867, 5309)))); }}Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!