java - example - Verwenden Sie Objects.hash() oder eigene hashCode() Implementierung?




java override hashcode() (2)

Beachten Sie, dass der Parameter von Objects.hash Object... . Dies hat zwei wesentliche Konsequenzen:

  • Primitive Werte, die in der Hash-Code-Berechnung verwendet werden, müssen this.id werden, zB wird this.id von long in Long konvertiert.
  • Ein Object[] muss erstellt werden, um die Methode aufzurufen.

Die Kosten für die Erstellung dieser "unnötigen" Objekte können sich addieren, wenn hashCode häufig aufgerufen wird.

Ich habe kürzlich die Objects.hash() -Methode entdeckt.

Mein erster Gedanke war, dass dies die Implementierung von hashCode hashCode() stark vereinfacht. Siehe das folgende Beispiel:

@Override
//traditional
public int hashCode() {
    int hash = 5;
    hash = 67 * hash + (int)(this.id ^ (this.id >>> 32));
    hash = 67 * hash + (int)(this.timestamp ^ (this.timestamp >>> 32));
    hash = 67 * hash + Objects.hashCode(this.severity);
    hash = 67 * hash + Objects.hashCode(this.thread);
    hash = 67 * hash + Objects.hashCode(this.classPath);
    hash = 67 * hash + Objects.hashCode(this.message);
    return hash;
}

@Override
//lazy
public int hashCode() {
    return Objects.hash(id, timestamp, severity, thread, classPath, message);
}

Obwohl ich sagen muss, dass dies zu gut ist, um wahr zu sein. Auch ich habe diese Verwendung noch nie gesehen.

Gibt es Nachteile bei der Verwendung von Objects.hash() Vergleich zur Implementierung Ihres eigenen Hash-Codes? Wann würde ich jeden dieser Ansätze wählen?

Aktualisieren

Obwohl dieses Thema als gelöst markiert ist, können Sie gerne Antworten veröffentlichen, die neue Informationen und Bedenken enthalten.


Es folgt die Implementierung von Objects.hash - die intern Arrays.hashCode aufruft.

public static int hash(Object... values) {
    return Arrays.hashCode(values);
}

Dies ist die Implementierung der Methode Arrays.hashCode

public static int hashCode(Object a[]) {
    if (a == null)
        return 0;

    int result = 1;

    for (Object element : a)
        result = 31 * result + (element == null ? 0 : element.hashCode());

    return result;
}

Also stimme ich @Andy zu. Die Kosten für die Erstellung dieser "unnötigen" Objekte können sich addieren, wenn hashCode häufig aufgerufen wird. Wenn Sie sich selbst implementieren, wäre es schneller.





hash