当前位置: 首页 > 面试题库 >

更改存储在基于Hash的集合中的对象的hashCode

阎咏思
2023-03-14
问题内容

我有一个基于哈希的对象集合,例如HashSetHashMap。当实施hashCode()时由于它是根据某些可变字段计算而可以随时间变化的,我会遇到什么问题?

它如何影响hibernate?有任何原因为什么hashCode()默认情况下返回对象的ID不好?如果重要的话,所有尚未持久化的对象都具有id = 0。

hashCode对于Hibernate映射的实体,合理的实现是什么?设置后,ID是不可变的,但是在将实体保存到数据库时并非如此。

我不担心HashSet键值为0的十几个实体的性能。我关心的是对我的应用程序和Hibernate使用ID作为哈希码是否安全,因为ID是在持久化时生成的,因此会发生变化。


问题答案:

如果同一对象的哈希码随时间变化,则结果基本上是不可预测的。哈希集合使用哈希代码将对象分配给存储桶-
如果您的哈希代码突然更改,则该集合显然不知道,因此它可能无法找到现有对象,因为它现在哈希到另一个存储桶。

本身返回一个对象的ID还不错,但是,如果其中许多对象都具有您提到的id =
0,则将降低哈希表的性能:所有具有相同哈希码的对象都位于同一存储桶中,因此您的哈希表格现在比线性列表更好。

更新: 从理论上讲,只要没有其他人知道,您的哈希码就可以更改-
这恰好暗示了@bestsss在他的注释中提到的内容,即从可能保存该对象的任何集合中删除您的对象,然后再次插入一次哈希码已更改。实际上,一个更好的选择是从对象的实际内容字段生成哈希码,而不是依赖数据库ID。



 类似资料:
  • 我想使用JaVers来跟踪我的Java对象的更改。基本示例工作正常,但我无法让它检测存储在集合中的对象的更改。 如果我扩展ChangeLogExample。更改例如其中一个子坐标的课堂示例: 这是打印的更改日志: 因此,第一个下属的年龄变化不会显示在变更日志中。 使用withChildValueObjects()没有什么不同。 当我单独将更改提交给员工实例时,我会得到学员年龄的更改,但这不是我想要

  • 问题内容: 想象一下,我们有这段代码。 由于空间限制,我没有将hashCode()和equals()的代码放入其中,但这是从Eclipse生成的代码。 问题在于,在更改两个集合中的元素之前,这两个集合是相等的。更改它们的值(每个值都相同)后,尽管e1.hashCode()== e2.hashCode()和e1.equals(e2),但这些集合不再相等。 我猜想在比较两个HashSet时,Java使

  • 我正在Firestore中制作一个“聊天演示”来保存信息,我是这样做的: 但问题是,文档显示它不存在,尽管它包含一个子集合。 正如上面写的:“这个文档不存在”,尽管它包含一个名为的子集合,其中包含更多文档。 但是我需要检查带有特定名称的文档是否存在于集合下。 我的代码是否有任何问题,或者我是否需要以其他方式进行? 提前谢谢。

  • 我有以下收藏: 其中看起来像这样: 现在我必须根据字段对集合进行排序,如何实现这一点?

  • 本文向大家介绍C#检查指定对象是否存在于ArrayList集合中的方法,包括了C#检查指定对象是否存在于ArrayList集合中的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#检查指定对象是否存在于ArrayList集合中的方法。分享给大家供大家参考。具体分析如下: C#的ArrayList提供了一个专用的Contains方法来检测ArrayList是否包含指定的对象,返回值是一