Frage

Es erscheint in java.lang.string.java, dass Java nur den Hashcode erzeugt und dann nach einem Anruf bei Hashcode () speichern wird, aber warum nicht einfach den Hashcode im Konstruktor machen?

Der entsprechende Code:

if (h == 0 && count > 0) {
    int off = offset;
    char val[] = value;
    int len = count;

    for (int i = 0; i < len; i++) {
        h = 31*h + val[off++];
    }

    hash = h;
}

könnte größtenteils in den Konstruktor platziert werden.

War es hilfreich?

Lösung

Warum Zeit damit verbringen, einen Hash -Code zu generieren, der höchstwahrscheinlich nicht verwendet wird? Die meisten Saiten werden gebaut, verwendet und dann Müll, der ohne den HashCode () gesammelt wird, jemals aufgerufen wird.

Andere Tipps

Joshua Bloch nennt diese Praxis "Racy Single-Check".

Jeremy Manson hat eine hervorragende Erklärung dafür, warum es getan ist und warum es sich ums Weise: in seinem Blog

Im Wesentlichen sparen Sie zum Zeitpunkt der Bauzeit einige Zeit, indem Sie berechnendes Hash -Code überspringen. In einer multithread -Umgebung zahlen Sie dies zurück, da mehrere Thread möglicherweise dieselbe Berechnung durchführen können.

Dies ist nicht wirklich das richtige Forum dafür und die Frage wird wahrscheinlich geschlossen. Sie können versuchen, auf Programmierer zu fragen.Stackexchange.com.

Ein Grund könnte sein, dass das Computerhashcode nicht billig ist und nur in einigen Fällen erforderlich ist.

2 Gründe:

1) Computer hashCode() ist nicht billig: ist ein O(n) Komplexität auf der Länge der Saite, also besser, sondern nur, wenn sie es nötig.

und:

2) String -Instanzen sind unveränderlich: Da sie sich nie ändern, berechnen Sie immer hashCode() höchstens einmal.

Es gibt keinen Vorteil, wenn Sie es in den Konstruktor platzieren. Aber es gibt einen Nachteil, wenn es im Konstruktor sein würde. Wenn HashCode für eine Zeichenfolge niemals aufgerufen wird, wurde die Berechnung für nichts durchgeführt. Und wenn Sie Hashcode () aufrufen, wird es in beiden Fällen einmal berechnet - nur an verschiedenen Orten und Zeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top