在hibernate manual中,如果您打算将持久性类的实例放入Set中(表示多值关联的推荐方法),则必须重写equals()和hashCode()方法。
所以出现了问题:
为什么推荐使用这种方法来表示集合中的多值关联?(为什么我不应该使用ArrayList或LinkedList)。
在幕后发生的事情是我只有在使用Set时才应覆盖这些方法?
答案 0 :(得分:2)
那么,HashSet
还会如何推导相等性?这基于hashCode/equals
。对于Set
,您将同时需要两种方法;对于List
,仅使用equals(例如,在类似contains
的方法中),但同时定义了这两种方法,因此您无需充满奇怪的惊喜。
通常,如果您还覆盖compareTo
中的Comparable
是件好事-例如,在平局中,这在HasMap
内部使用被发现。如果您打算将它们作为Map
中的键,则不必这样做,但这在某种程度上是个好主意。
当两个hashCode相等且tie
决定移至HashMap
时,将使用我所说的perfectly balanced tree node
,请参阅here
或this one; or even this one
答案 1 :(得分:0)
为什么推荐使用这种方式来表示多值关联 设置?(为什么我不应该使用ArrayList或LinkedList)-
许多关系总是唯一的,将重复的值保留在一个集合中没有意义。如您所知,set始终存储唯一值,因此建议使用Set。
在幕后发生的事情是我应该重写这些方法 仅当我使用Set时? -
Set仅存储唯一元素。 Set在内部使用Hashmap来存储元素。因此,使用hashCode()进行存储桶识别,并使用equals()方法比较元素。