Heim > Java > javaLernprogramm > Warum verwendet Java 31 als Multiplikator im hashCode() von String?

Warum verwendet Java 31 als Multiplikator im hashCode() von String?

DDD
Freigeben: 2024-12-19 17:07:10
Original
886 Leute haben es durchsucht

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

Eintauchen in die Überlegungen hinter Javas 31-Multiplikator für Strings hashCode()

Javas String-Implementierung verwendet eine spezielle Formel zur Berechnung des Hash-Codes:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
Nach dem Login kopieren

wobei s[i] das i-te Zeichen der Zeichenfolge bezeichnet, n ihre Länge darstellt und ^ bedeutet Potenzierung. Es stellt sich jedoch die Frage: Warum ist der Multiplikator auf 31 festgelegt?

Diese Wahl ergibt sich aus den Prinzipien, die in Joshua Blochs berühmtem Buch „Effective Java, Second Edition“ dargelegt sind. Blochs Argumentation konzentriert sich auf zwei Schlüsselkriterien für den Multiplikator: Es sollte eine relativ große Primzahl sein.

Die Vorteile eines Multiplikators für ungerade Primzahlen

Bloch hebt hervor, dass er eine Ein ungerader Primzahlmultiplikator wie 31 stellt sicher, dass die Multiplikationsoperation nicht zu Informationsverlusten aufgrund eines Überlaufs führt. Wenn der Multiplikator gerade wäre, könnte es zu einem Überlauf kommen, und da die Multiplikation mit 2 analog zur Verschiebung ist, könnten wichtige Informationen beeinträchtigt werden.

Die subtileren Vorteile eines Prime-Multiplikators

Während die spezifischen Vorteile der Auswahl eines Primzahlmultiplikators weniger offensichtlich sind, entspricht sie den üblichen Praktiken. Bemerkenswert ist, dass 31 eine einzigartige Eigenschaft besitzt: Sie ermöglicht den effizienten Ersatz der Multiplikation durch eine Verschiebung und eine Subtraktion, was zu einer verbesserten Leistung führt. Diese Optimierung wird oft automatisch von modernen virtuellen Maschinen (VMs) ausgeführt.

Der Konsens

Zusammenfassend lässt sich sagen, dass Java 31 als Multiplikator für die hashCode()-Methode von String verwendet ergibt sich aus ihrem Status als ungerade Primzahl. Diese Wahl schützt vor Informationsverlust aufgrund von Überlauf und ermöglicht Leistungssteigerungen durch den Ersatz der Multiplikation durch Verschiebung und Subtraktion.

Das obige ist der detaillierte Inhalt vonWarum verwendet Java 31 als Multiplikator im hashCode() von String?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage