i具有一个自定义对象,其中属性包括可以是null
的整数(例如Integer num1
和Integer 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[])
返回List
,List.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()
的手册。