为什么需要使用Set为多值关联重写equals()和hashcode()?

时间:2018-09-09 15:02:34

标签: java hibernate

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

所以出现了问题:

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

  • 在幕后发生的事情是我只有在使用Set时才应覆盖这些方法?

2 个答案:

答案 0 :(得分:2)

那么,HashSet还会如何推导相等性?这基于hashCode/equals。对于Set,您将同时需要两种方法;对于List,仅使用equals(例如,在类似contains的方法中),但同时定义了这两种方法,因此您无需充满奇怪的惊喜。

通常,如果您还覆盖compareTo中的Comparable是件好事-例如,在平局中,这在HasMap内部使用被发现。如果您打算将它们作为Map中的键,则不必这样做,但这在某种程度上是个好主意。

当两个hashCode相等且tie决定移至HashMap时,将使用我所说的perfectly balanced tree node,请参阅here  或this oneor even this one

答案 1 :(得分:0)

  

为什么推荐使用这种方式来表示多值关联   设置?(为什么我不应该使用ArrayList或LinkedList)-

许多关系总是唯一的,将重复的值保留在一个集合中没有意义。如您所知,set始终存储唯一值,因此建议使用Set。

  

在幕后发生的事情是我应该重写这些方法   仅当我使用Set时? -

Set仅存储唯一元素。 Set在内部使用Hashmap来存储元素。因此,使用hashCode()进行存储桶识别,并使用equals()方法比较元素。