在调用 Objects.hash() 之前是否需要检查值是否为空?

14w*_*wml -1 java hash hashcode

我有一个自定义对象,其属性包括可以是整数(例如Integer num1Integer num2null

对于 equal 函数,我通过执行 来确定 2 个自定义对象是否相等return num1 == customObj.num1 && num2 == customObj.num2。这工作 b/cnull == nulltrue在 Java 中。

所以我想知道在我的对象的哈希码函数中是否可以这样做return Objects.hash(num1, num2)

我只是不确定我是否可以将null对象传递给它Objects.hash(...),是否会以某种方式弄乱哈希码,或者我是否会得到NullPointerException.

And*_*ner 7

如果这些引用中的一个为空,您必须对文档进行一些挖掘,以找出行为将是什么。

Objects.hash(Object...) 说:

哈希码的生成就像将所有输入值放入一个数组中一样,并且该数组通过调用 Arrays.hashCode(Object[]).

Arrays.hashCode(Object[]) 说:

此方法返回的值等于将返回的值 Arrays.asList(a).hashCode()

Arrays.asList(Object[])返回 a List,并List.hashCode()说:

列表的哈希码定义为以下计算的结果:

int hashCode = 1;
for (E e : list)
  hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());
Run Code Online (Sandbox Code Playgroud)

因此,空元素的处理方式与哈希码为零的对象相同。

虽然需要一些挖掘才能得到这个答案,但一个更简单的策略是尝试它 - 你可以像那样更快地得到你的答案。