在调用objects.hash()之前,我需要检查值是否为null



i具有一个自定义对象,其中属性包括可以是null的整数(例如Integer num1Integer num2)。

对于相等的功能,我通过执行return num1 == customObj.num1 && num2 == customObj.num2确定我的自定义对象的2是否相等。这项工作b/c null == null是java中的 true

所以我想知道在我的对象的HashCode函数中是否可以进行return Objects.hash(num1, num2)

可以

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

您必须在文档中进行一些挖掘,以查找如果其中一个参考为null。

Objects.hash(Object...)说:

Hash代码是生成的,好像所有输入值都放在数组中,并且通过调用Arrays.hashCode(Object[])

Arrays.hashCode(Object[])说:

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

将返回的值

Arrays.asList(Object[])返回ListList.hashCode()说:

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

int hashCode = 1;
for (E e : list)
  hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());

因此,无效的元素将与Hash代码为零的对象相同。

虽然花了一点挖掘才能达到这个答案,但要尝试的一个更简单的策略就是尝试过 - 您可以更快地得到答案。

您可以使用Objects#hashcode

如文档对象#hashcode中所述,仅为非null参数生成 hash code,如果参数为 null,则仅生成0。最终您将永远不会得到NullPointerException

返回非null参数的哈希码,为null的0 参数。


如果您有多个字段,则可以使用其超载版本Objects#hash(Object... values)根据文档

生成一系列输入值的哈希代码。哈希代码是 生成的好像所有输入值都放在数组中,并且 该数组是通过调用arrays.hashcode(object [])的哈希。

您的测试平等方法被打破了。

当两个Integer对象均为null时,它起作用,但通常在非null时起作用。您正在比较对象的引用而不是其数值。

使用Objects.equals()使用对象的equals()方法执行NULL-SAFE测试。当您在那里时,请阅读Objects.hashCode()的手册。

最新更新