首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在调用Objects.hash()之前,是否需要检查一个值是否为null?

在调用Objects.hash()之前,是否需要检查一个值是否为null?
EN

Stack Overflow用户
提问于 2017-11-28 04:38:36
回答 3查看 3.5K关注 0票数 0

我有一个自定义对象,它的属性包括整数(例如Integer num1Integer num2),可以是null

对于相等的函数,我通过执行return num1 == customObj.num1 && num2 == customObj.num2来确定我的自定义对象中的两个是否相等。这是在Java中使用的b/c null == nulltrue

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

我只是不确定是否可以将null对象传递给Objects.hash(...),这是否会在某种程度上破坏哈希代码,或者是否会得到一个NullPointerException

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-11-28 04:43:26

您可以使用Objects#hashcode

正如docs中所提到的,Objects#hashcode只为非空参数生成hash code,如果参数为null,则生成0。最终你将永远得不到NullPointerException

返回非空参数的哈希代码和空参数的0。

如果有多个字段,则可以按照文档使用其重载版本Objects#hash(Object... values)

为输入值序列生成哈希代码。哈希代码被生成,就好像所有输入值都放在一个数组中一样,该数组是通过调用Arrays.hashCode(Object[])来散列的。

票数 2
EN

Stack Overflow用户

发布于 2017-11-28 06:17:41

如果这些引用之一为null,您必须在文档中进行一点挖掘,才能找到这种行为。

Objects.hash(Object...)说:

哈希代码被生成,就好像所有的输入值都放在一个数组中一样,并且该数组是通过调用更高级的Arrays.hashCode(Object[])来散列的。

Arrays.hashCode(Object[])说:

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

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

列表的哈希代码被定义为下列计算的结果: int hashCode = 1;for (E : list) hashCode = 31*hashCode + (e==null ?0: e.hashCode());

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

虽然要找到这个答案需要花点时间,但一个简单得多的策略就是尝试一下--你可以像这样更快地得到答案。

票数 8
EN

Stack Overflow用户

发布于 2017-11-28 05:12:35

您测试等式的方法已被破坏。

虽然当两个Integer对象都是null时,它可以工作,但是当它们是非空的时候,它通常就不能工作了。您正在比较对象的引用,而不是它们的数值。

使用Objects.equals()使用对象的equals()方法执行空安全测试。当你在那里的时候,阅读手册

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47524121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档