Neden Java'In hashCode() Dize çarpanı olarak 31 kullan?
Java, String
bir nesne için hash code olarak hesaplanır
s[0]*31^(n-1) s[1]*31^(n-2) ... s[n-1]
s[i]
* * * * int
aritmetik, kullanarak i
thdizenin karakter, n
dize uzunluğunu, ^
üs gösterir.
Neden 31 çarpanı olarak kullanılır?
Çarpan oldukça büyük bir asal sayı olması gerektiğini anlıyorum. Neden 29 ya da 37, ve hatta 97 değil mi?
CEVAP
Joshua göre Bloch Effective Java (sürekli sayesinde aldım yeterli ve tavsiye edilecek bir kitap stackoverflow üzerinde söz edilen):
Değeri 31 garip bir başbakan olduğu için seçildi. Hatta ve çarpma taştı, bilgi 2 ile çarpma değişen eşdeğer olarak kaybetmiş olurdu. Bir başbakan kullanmanın avantajı, daha az açıktır, ama bu bir gelenek. 31 güzel bir özellik çarpma kayması ve daha iyi performans için bir çıkarma tarafından değiştirilebilir:
31 * i == (i << 5) - i
. Modern VMs optimizasyon bu tür otomatik olarak yapmak.
(Bölüm 3, Madde 9: her Zaman göz ardı eşit olduğunda hashcode, sayfa 48) geçersiz kılar
Neden char[] şifreler için Dize Java t...
Neden Java Vector sınıfı eski veya kul...
Neden Java statik olarak bir sınıf bil...
Nasıl bir dize olarak yöntem adı veril...
Liste<Köpek> Listenin alt<Hay...