Java's String hashCode() Mystery: Mengapa Pengganda 31?
Kaedah hashCode() Java untuk rentetan ialah aspek asas mereka penyimpanan dan perolehan semula yang cekap dalam struktur data. Dengan menggabungkan aksara rentetan dalam formula tertentu, ia menghasilkan integer yang mewakili identiti unik rentetan itu. Walau bagaimanapun, pilihan pengganda 31 dalam formula ini menimbulkan persoalan.
Mengapa 31 sebagai Pengganda?
Dokumentasi Java menunjukkan bahawa nombor perdana yang agak besar harus digunakan sebagai pengganda untuk mengelakkan perlanggaran cincang dan mencapai pengedaran seragam. Namun, mengapa tidak 29, 37, atau 97 berbanding 31?
Sebab 1: Odd Prime
Menurut "Effective Java" Joshua Bloch, pilihan 31 berpunca daripada menjadi perdana ganjil. Menggunakan nombor genap boleh mengakibatkan kehilangan maklumat jika pendaraban melimpah, kerana pendaraban dengan 2 adalah bersamaan dengan peralihan.
Sebab 2: Pengoptimuman Prestasi
Sifat menarik sebanyak 31 adakah pendaraban dengannya boleh digantikan dengan cekap dengan anjakan dan penolakan: 31 * i == (i << 5) - i. Mesin maya moden sering melakukan pengoptimuman ini secara automatik, meningkatkan prestasi pengiraan Kod hash().
Kepentingan Keutamaan
Walaupun kurang jelas, penggunaan nombor perdana juga mempunyai faedah. Nombor perdana mengagihkan nilai dengan lebih sekata, mengurangkan kemungkinan perlanggaran cincang berbanding dengan pengganda bukan perdana. Ini meningkatkan keupayaan untuk membezakan rentetan unik dan mengekalkan prestasi perolehan semula yang konsisten.
Oleh itu, pengganda 31 dalam kaedah Java's String hashCode() bukanlah pilihan sewenang-wenangnya tetapi hasil daripada pengoptimuman, kecekapan dan pengelakan perlanggarannya. sifat, menjadikannya nilai yang berkesan untuk mengenal pasti dan mengurus objek rentetan.
Atas ialah kandungan terperinci Mengapakah Java `String.hashCode()` Menggunakan 31 sebagai Pengganda?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!