Und was meinst du dazu? Weiss nicht ob man da nicht zuviel
Aufhebens um ein Problem, das eigentlich keins ist, macht…
Würde mich wundern, wenn die Java-API nicht so schlau wäre, den Hash-Wert nur beim ersten Zugriff zu berechnen und danach fest zu speichern. Strings sind ja schließlich einzig und allein aus Geschwindigkeitsgründen unveränderbar, da wäre diese kleine Optimierung doch schon sehr naheliegend, oder?
Allerdings steht in der Doku nur folgendes:
hashCode
public int hashCode()
Returns a hashcode for this string. The hashcode for a String
object is computed as
s[0]\*31^(n-1) + s[1]\*31^(n-2) + ... + s[n-1]
using int arithmetic, where s[i] is the ith character of the
string, n is the length of the string, and ^ indicates
exponentiation. (The hash value of the empty string is zero.)
Overrides:
hashCode in class Object
Returns:
a hash code value for this object.
… und ergo gar nichts zu internen Optimierungen. Wer auf Nummer Sicher gehen will, kann aber natürlich eine Unterklasse ableiten, darin hashCode() überschreiben und den Wert eben nur beim ersten Aufruf berechnen lassen (danach ein Flag setzen, aber „synchronized“ ist sicherlich hier nicht nötig).
Dann kann nix mehr schiefgehen (kostet schlimmstenfalls ein bisschen Speicherplatz, eben 1x int+boolean). Ach so, dann müssten natürlich auch noch alle Methoden überschrieben werden, die einen neuen String aus dem alten erzeugen, damit diese auch wieder ein Objekt des neuen Typs erzeugen…
Schon ein bisschen aufwändig, das „von außen“ zu machen. Hat eigentlich schon mal wer nachgemessen, ob alle Berechnungen des Hash-Wertes wirklich gleich schnell (bzw. langsam) sind? Wäre ja wohl das erste, oder? Na ja, außer vielleicht mal in den Quellcode des JDKs zu schauen natürlich, den gibt’s ja zum Download…
Gruß,
Stefan 