在hibernate manual据说如果您打算将持久类的实例放入一个 Set 中(推荐的表示多值关联的方法),则必须重写 equals() 和 hashCode() 方法。
于是问题出现了:
为什么它是表示集合中多值关联的推荐方法?(为什么我不应该使用 ArrayList 或 LinkedList)。
我应该仅在使用 Set 时重写这些方法的幕后发生了什么?
最佳答案
那么,HashSet
还能如何推断出相等性呢?这是基于hashCode/equals
。对于 Set
您可能需要这两种方法,对于 List
仅使用 equals(例如在 contains
之类的方法中),但它们是定义两者,这样您就不会遇到奇怪的惊喜。
一般如果您从 Comparable
覆盖 compareTo
也是一件好事 - 例如,这在内部用于 HasMap
当找到平局时。您不必这样做,但如果您计划将这些作为 Map
中的键,这在某种程度上是个好主意。
我说的那个tie
是在两个hashCodes相等并且HashMap
决定移动到一个完美平衡的树节点
时使用的,见here
或 this one ; or even this one
关于java - 为什么需要为多值关联使用 Set 覆盖 equals() 和 hashcode()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52245739/