问题
According to a comment from this post, hascode
of null objects
can throw NPE
or a value of zero
. This is implementation specific. but within the same implementation, why does
Objects.hashcode
and hascode(instance)
return different values. for ex:
public class EqualsTesting {
public static void main(String[] args){
String p1 =null;
String p2 = null;
System.out.println(Objects.hashCode(p1));
System.out.println(p2.hashCode());
}
}
Output:
0
Exception in thread "main" java.lang.NullPointerException
at BinaryTrees.EqualsTesting.main(EqualsTesting.java:14)
If this is the case, will this not affect the key look-up
in HashMap
where null Key-value pairs
are allowed. (It might either hash
to bucket 0
or throw a NPE
)
回答1:
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;
}
回答2:
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.
回答3:
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.
回答4:
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!)
来源:https://stackoverflow.com/questions/21535029/what-must-be-hashcode-of-null-objects-in-java