java - 为什么需要为多值关联使用 Set 覆盖 equals() 和 hashcode()?

标签 java hibernate

hibernate manual据说如果您打算将持久类的实例放入一个 Set 中(推荐的表示多值关联的方法),则必须重写 equals() 和 hashCode() 方法。

于是问题出现了:

  • 为什么它是表示集合中多值关联的推荐方法?(为什么我不应该使用 ArrayList 或 LinkedList)。

  • 我应该仅在使用 Set 时重写这些方法的幕后发生了什么?

最佳答案

那么,HashSet 还能如何推断出相等性呢?这是基于hashCode/equals。对于 Set 您可能需要这两种方法,对于 List 仅使用 equals(例如在 contains 之类的方法中),但它们是定义两者,这样您就不会遇到奇怪的惊喜。

一般如果您从 Comparable 覆盖 compareTo 也是一件好事 - 例如,这在内部用于 HasMap 当找到平局时。您不必这样做,但如果您计划将这些作为 Map 中的键,这在某种程度上是个好主意。

我说的那个tie是在两个hashCodes相等并且HashMap决定移动到一个完美平衡的树节点时使用的,见herethis one ; or even this one

关于java - 为什么需要为多值关联使用 Set 覆盖 equals() 和 hashcode()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52245739/

相关文章:

hibernate - GROUP_CONCAT Hibernate HQL

java - 使用 DataJpaTest 时,在 Hibernate 上使用 IdClass 作为复合键的复合键

java - 迁移到 Hibernate 5

java - xdoclet 与 xdoclet2?

java - 如何在 hibernate 中重用 Criteria 对象?

java - 在 java 中返回 try-catch finally block 。这个例子有什么好处吗?

java - 如何通过 Mockito 对被测类的私有(private)方法进行 stub

java - Hibernate - 简单查询延迟获取

java - 从哪里获得 vertx 仪表板监视器?

java - 如何设置JDK的路径?