Rumah > Java > javaTutorial > Mengapakah Java `String.hashCode()` Menggunakan 31 sebagai Pengganda?

Mengapakah Java `String.hashCode()` Menggunakan 31 sebagai Pengganda?

DDD
Lepaskan: 2024-12-17 22:15:18
asal
214 orang telah melayarinya

Why Does Java's `String.hashCode()` Use 31 as the Multiplier?

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan