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]
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!