Laut einem Kommentar aus diesem Beitrag , hascode
von null objects
kann throw NPE
oder ein Wert von zero
. Dies ist implementierungsspezifisch. aber innerhalb der gleichen Implementierung, warum
Objects.hashcode
und hascode(instance)
geben unterschiedliche Werte zurück. für ex:
Ausgabe:
%Vor% Wenn dies der Fall ist, wirkt sich dies nicht auf key look-up
in HashMap
aus, wo null Key-value pairs
erlaubt sind. (Es könnte entweder hash
bis bucket 0
oder throw a NPE
)
Wie würden Sie hashCode
eines Objekts berechnen, das gar nicht existiert? Wenn p2
null
ist, wird beim Aufruf einer beliebigen Methode ein NPE
geworfen. Das gibt Ihnen keinen besonderen Wert eines hashCodes.
Objects.hashCode()
ist nur eine Wrapper-Methode, die eine Vorprüfung für null
-Werte durchführt, und für eine Referenz, die nicht null
ist, gibt sie denselben Wert wie p2.hashCode()
zurück, wie in diesem Fall. Hier ist der Quellcode der Methode:
Wenn Sie sich umsehen werden, werden Sie feststellen, dass HashMap
einen speziellen hat Handhabung von für null
Schlüssel. null
-Werte sind in Ordnung, da Sie keinen Hash-Code für sie in HashMap
berechnen. Dies ist der Grund, warum null
keys in HashMap
gut funktionieren. Warum Objects.hashCode
gut funktioniert, werfen Sie einen Blick auf Rohits Antwort.
Laut einem Kommentar aus diesem Post kann Haskode von Null-Objekten NPE oder einen Wert von Null werfen.
Das ist nicht wahr. (Und das sagt @ Bohemian nicht!)
Was in HashMap
und HashSet
passiert, ist, dass sie null
als Sonderfall behandeln. Anstatt hashcode()
für das null
-Objekt aufzurufen (was NPE !! wäre), verwenden sie null als hartcodierten alternativen Hashcode.
Ich betone ... dies ist ein Sonderfallverhalten von HashMap
und HashSet
... nicht hashcode()
.
Wie Ihr Beispiel zeigt, erhalten Sie , wenn Sie versuchen, die Methode hashcode()
für null
aufzurufen, eine NPE. Das JLS sagt, dass das passiert ... und es passiert, wenn Sie versuchen, any Instanzmethode auf null
aufzurufen.
(Auf der anderen Seite behandelt die Methode Objects.hashCode(obj)
den Fall, in dem obj
als Sonderfall null
ist. Und das ist der springende Punkt der statischen Methode!)
Als das Javadoc sagt:
Objects.hashCode (Objekt o)
Gibt den Hash-Code eines Nicht-Null-Arguments und 0 für eine Null zurück Argument.
p2.hashCode()
gibt NullPointerException
aus, weil Sie versuchen, auf eine Methode eines Nullobjekts zuzugreifen.