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

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

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-19 10:46:11657semak imbas

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

Mengapa Java's hashCode() dalam String Menggunakan 31 sebagai Pengganda

Di Java, kaedah hashCode() untuk objek String menggunakan yang berikut formula:

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

di mana s[i] ialah watak ke-i, n ialah panjang rentetan, dan ^ menandakan eksponen. Ini menimbulkan persoalan: mengapa 31 dipilih secara khusus sebagai pengganda?

Rasional untuk Pengganda Perdana

Dokumentasi mencadangkan menggunakan nombor perdana yang agak besar sebagai pengganda kepada meminimumkan perlanggaran dalam jadual cincang. Perlanggaran berlaku apabila objek berbeza menghasilkan kod cincang yang sama, yang berpotensi membawa kepada isu prestasi. Nombor perdana menawarkan pengedaran kod cincang yang lebih baik, mengurangkan kemungkinan perlanggaran.

Mengapa Bukan Perdana Lain?

Pemilihan 31 antara nombor prima lain dikaitkan dengan dua faktor:

  1. Pencegahan Limpahan: Jika pengganda adalah genap dan pendaraban melimpah, maklumat akan hilang. Ini kerana pendaraban dengan 2 adalah bersamaan dengan operasi anjakan.
  2. Pengoptimuman Prestasi: Nilai 31 membenarkan pengoptimuman di mana pendaraban boleh digantikan dengan anjakan dan penolakan: 31 * i = = (i << 5) - i. Mesin maya moden melakukan pengoptimuman ini secara automatik.

Oleh itu, 31 memenuhi kedua-dua kriteria sebagai nombor perdana untuk mengelakkan perlanggaran sambil mendayakan operasi pencincangan yang cekap untuk objek String di Java.

Atas ialah kandungan terperinci Mengapakah Java `String.hashCode()` Menggunakan 31 sebagai Penggandanya?. 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