比较Java hashCode()方法是否是对象相等性的可靠度量?
我目前正在比较两个相同类型的复杂对象,其中多个字段由自定义对象类型的数据结构组成。假设没有任何自定义对象重写了hashCode()
方法,如果我比较对象中每个字段的哈希代码,结果都是相同的,那么我是否有100%的信心相信比较对象的内容是相同的?如果没有,假设我不能使用任何外部库,您建议使用哪种方法来比较两个对象
你可以在下面搜索框中键入要查询的问题!
我目前正在比较两个相同类型的复杂对象,其中多个字段由自定义对象类型的数据结构组成。假设没有任何自定义对象重写了hashCode()
方法,如果我比较对象中每个字段的哈希代码,结果都是相同的,那么我是否有100%的信心相信比较对象的内容是相同的?如果没有,假设我不能使用任何外部库,您建议使用哪种方法来比较两个对象
# 1 楼答案
如果尚未重写
hashCode()
方法,则所有对象都是不相等的。通过覆盖它,您可以提供比较的逻辑。请记住,如果重写hashCode(),则肯定应该重写equals()
。 编辑: 当然,仍然可能存在冲突m,但是如果您没有覆盖equal()
,您的对象将通过引用进行比较(对象等于自身)# 2 楼答案
不,缺少
hashCode()
碰撞只意味着对象可以相同,这是永远的保证唯一的保证是,如果
hashCode()
值不同(并且hashCode()
/equals()
实现是正确的),那么对象将不为equal
此外,如果您的自定义类型没有}
hashCode()
实现,那么该值对于比较对象的内容是完全无用的,因为它将是^{# 3 楼答案
通常的
Object.hashCode()
JVM实现是以某种格式返回对象的内存地址,因此从技术上讲,这将用于您想要的内容(因为没有两个对象可以共享相同的地址)然而,实际的
Object.hashCode()
规范并不能保证,也不应该在任何合理或编写良好的代码中用于此目的我建议您使用ApacheCommons库中提供的hashCode和equals构建器,或者如果您真的不能使用免费的外部libs,请查看它们以获得灵感。不过,使用的最佳方法完全取决于“equal”在应用程序域上下文中的实际含义
# 4 楼答案
绝对不是。您应该仅使用
hashCode()
作为第一次传递-如果散列码不同,您可以假定对象不相等。如果散列码相同,则应然后调用equals()
检查是否完全相等这样想:只有2个32个可能的散列码。例如
String
类型的对象可能有多少种?远不止这些。因此,至少两个不相等的字符串必须共享相同的哈希代码埃里克·利珀特writes well about hash codes——无可否认,他来自一家公司。NET的观点,但原则是相同的