我有一个自定义对象,它的属性包括整数(例如Integer num1
和Integer num2
),可以是null
。
对于相等的函数,我通过执行return num1 == customObj.num1 && num2 == customObj.num2
来确定我的自定义对象中的两个是否相等。这是在Java中使用的b/c null == null
是true
。
所以我在想,在我的对象的hashcode函数中,是否可以执行return Objects.hash(num1, num2)
我只是不确定是否可以将null
对象传递给Objects.hash(...)
,这是否会在某种程度上破坏哈希代码,或者是否会得到一个NullPointerException
。
发布于 2017-11-28 04:43:26
您可以使用Objects#hashcode
正如docs中所提到的,Objects#hashcode只为非空参数生成hash code
,如果参数为null
,则生成0。最终你将永远得不到NullPointerException
。
返回非空参数的哈希代码和空参数的0。
如果有多个字段,则可以按照文档使用其重载版本Objects#hash(Object... values)
。
为输入值序列生成哈希代码。哈希代码被生成,就好像所有输入值都放在一个数组中一样,该数组是通过调用Arrays.hashCode(Object[])来散列的。
发布于 2017-11-28 06:17:41
如果这些引用之一为null,您必须在文档中进行一点挖掘,才能找到这种行为。
哈希代码被生成,就好像所有的输入值都放在一个数组中一样,并且该数组是通过调用更高级的
Arrays.hashCode(Object[])
来散列的。
此方法返回的值等于
Arrays.asList(a).hashCode()
将返回的值。
Arrays.asList(Object[])
返回一个List
,List.hashCode()
说:
列表的哈希代码被定义为下列计算的结果: int hashCode = 1;for (E : list) hashCode = 31*hashCode + (e==null ?0: e.hashCode());
因此,空元素的处理方式与哈希代码为零的对象相同。
虽然要找到这个答案需要花点时间,但一个简单得多的策略就是尝试一下--你可以像这样更快地得到答案。
发布于 2017-11-28 05:12:35
您测试等式的方法已被破坏。
虽然当两个Integer
对象都是null
时,它可以工作,但是当它们是非空的时候,它通常就不能工作了。您正在比较对象的引用,而不是它们的数值。
使用Objects.equals()
使用对象的equals()
方法执行空安全测试。当你在那里的时候,阅读。手册
https://stackoverflow.com/questions/47524121
复制相似问题