Was muss Hashcode von Null-Objekten in Java sein?

7

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:

%Vor%

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 )

sein     
eagertoLearn 03.02.2014, 18:37
quelle

4 Antworten

12

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:

%Vor%     
Rohit Jain 03.02.2014, 18:40
quelle
5

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.

    
Sanjay T. Sharma 03.02.2014 18:39
quelle
2
  

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

    
Stephen C 03.02.2014 18:45
quelle
1

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.

    
Happy 03.02.2014 18:42
quelle

Tags und Links