what must be hashcode of null objects in Java?

后端 未结 4 1396
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-19 23:14

According to a comment from this post, hascode of null objects can throw NPE or a value of zero. This is implementation speci

相关标签:
4条回答
  • 2021-02-19 23:47

    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.

    0 讨论(0)
  • 2021-02-19 23:49

    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.

    0 讨论(0)
  • 2021-02-20 00:02

    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;
    }
    
    0 讨论(0)
  • 2021-02-20 00:09

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

    0 讨论(0)
提交回复
热议问题