如果仅在类中重写hashCode()并在Set中使用它,会发生什么情况?

如果仅在类中重写hashCode()并在Set中使用它,会发生什么情况?,第1张

如果仅在类中重写hashCode()并在Set中使用它,会发生什么情况?

James Large答案是错误的,或者是误导性的(部分错误也是如此)。我会解释。

如果两个对象根据其equals()方法相等,则它们还必须具有相同的哈希码。如果两个对象具有相同的哈希码,则它们也不必相等。

这是java.util.Object文档中的实际措辞:

  • 如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。
    *如果根据equals(java.lang.Object)方法,两个对象不相等,则不需要在两个对象中的每个对象上调用hashCode方法必须产生不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

的确,如果两个对象没有相同的哈希,那么它们将不相等。但是,哈希不是检查相等性的方法-因此说它是检查相等性的较快方法是非常不正确的。

同样,说hashCode函数是执行任何 *** 作的有效方法,这也是非常不正确的。这完全取决于实现,但是随着String变大,字符串的hashCode的默认实现效率很低。它将基于String的每个字符执行计算,因此,如果您使用大型Strings作为键,则效率会非常低;此外,如果您有大量的存储桶。

在地图中(HashSet在内部使用HashMap),其中包含存储桶,并且每个存储桶中都有一个链表。Java使用hashCode()函数找出它属于哪个存储桶(它实际上将修改哈希,具体取决于存在的存储桶数量)。由于两个对象可能共享相同的哈希,因此接下来它将依次遍历链接列表,并检查equals()方法以查看该对象是否为重复对象。根据java.util.Set文档:

不包含重复元素的集合。

因此,如果其hashCode()将其引导到存储桶,该存储桶中包含一个.equals()计算为true的对象,则先前的对象将被新对象覆盖。您可能可以在此处查看更多信息:
JavaHashMap如何使用相同的哈希码处理不同的对象?

通常来说,优良作法是,如果覆盖hashCode函数,那么也将覆盖equals函数(如果我没记错的话,如果选择不这样做,就会违反合同)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5092452.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-16
下一篇 2022-11-16

发表评论

登录后才能评论

评论列表(0条)

保存