Rumah >Java >javaTutorial >Mengapa Java Menggunakan 31 sebagai Pengganda dalam Kod hash () String?

Mengapa Java Menggunakan 31 sebagai Pengganda dalam Kod hash () String?

DDD
DDDasal
2024-12-19 17:07:10901semak imbas

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

Menyelidiki Penaakulan di sebalik Pengganda 31 Java untuk Kod hash String()

Pelaksanaan String Java menggunakan formula khusus untuk mengira kod cincang:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

di mana s[i] menandakan aksara ke-i rentetan, n mewakili panjangnya, dan ^ menandakan eksponen. Walau bagaimanapun, pertanyaan berkaitan timbul: mengapa pengganda ditetapkan pada 31?

Pilihan ini berpunca daripada prinsip yang digariskan dalam buku terkenal Joshua Bloch, "Effective Java, Second Edition." Rasional Bloch tertumpu pada dua kriteria utama untuk pengganda: ia mestilah nombor perdana yang agak besar.

Faedah Pengganda Perdana Ganjil

Bloch menyerlahkan bahawa menggunakan pengganda perdana ganjil seperti 31 memastikan bahawa operasi pendaraban tidak akan mengakibatkan kehilangan maklumat akibat limpahan. Jika pengganda adalah genap, limpahan mungkin berlaku dan memandangkan pendaraban dengan 2 adalah analog kepada peralihan, maklumat penting boleh terjejas.

Faedah Yang Lebih Halus daripada Pengganda Utama

Walaupun kelebihan khusus memilih pengganda utama kurang jelas, ia sejajar dengan amalan biasa. Terutama, 31 mempunyai atribut unik: ia membolehkan pendaraban digantikan dengan cekap dengan anjakan dan penolakan, yang membawa kepada prestasi yang lebih baik. Pengoptimuman ini selalunya dilaksanakan secara automatik oleh mesin maya moden (VM).

Konsensus

Ringkasnya, penggunaan Java 31 sebagai pengganda untuk kaedah hashCode() String berpunca daripada statusnya sebagai nombor perdana ganjil. Pilihan ini melindungi daripada kehilangan maklumat akibat limpahan dan membolehkan peningkatan prestasi melalui penggantian pendaraban dengan peralihan dan penolakan.

Atas ialah kandungan terperinci Mengapa Java Menggunakan 31 sebagai Pengganda dalam Kod hash () String?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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