According to a comment from this post, hascode
of null objects
can throw NPE
or a value of zero
. This is implementation speci
As the javadoc says:
Objects.hashCode(Object o)
Returns the hash code of a non-null argument and 0 for a null argument.
p2.hashCode()
throws a NullPointerException
because you are trying to access a method of a null object.
If you will search around, you'll notice that HashMap
has a special handling for null
keys. null
values are fine as you don't compute hash code for them in a HashMap
. This is the reason why null
keys work fine in HashMap
. As to why Objects.hashCode
works fine, take a look at Rohit's answer.
How would you calculate hashCode
of an object that doesn't even exists? When p2
is null
, invoking any method on it will throw a NPE
. That isn't giving you any particular value of a hashCode.
Objects.hashCode()
is just a wrapper method, which performs a pre-check for null
values, and for reference that is not null
, it returns the same value as p2.hashCode()
as in this case. Here's the source code of the method:
public static int hashCode(Object o) {
return o != null ? o.hashCode() : 0;
}
According to a comment from this post, hascode of null objects can throw NPE or a value of zero.
That is not true. (And it is not what @Bohemian's comment is saying!)
What happens in HashMap
and HashSet
is that they treat null
as a special case. Instead of calling hashcode()
on the null
object (which would NPE!!), they use zero in as a hard-coded alternative hashcode.
I stress ... this is special case behaviour of HashMap
and HashSet
... not hashcode()
.
As your example shows, if you do attempt to call the hashcode()
method on null
, you will get an NPE. The JLS says that that is what will happen ... and it happens whenever you try to invoke any instance method on null
.
(On the other hand, the Objects.hashCode(obj)
method does deal with the case where obj
is null
as a special case. And that's the whole point of the static method!)