在Hibernate手册中,如果您打算将持久性类的实例放入Set(表示多值关联的推荐方法),则必须重写equals()和hashCode()方法。
于是问题出现了:
>
在幕后发生了什么,我应该只在使用Set时重写这些方法?
那么,HashSet
如何推导等式呢?这是基于hashCode/equals
。对于集合
您需要两种方法,因为列表
仅使用equals(例如在包含
的方法中),但它们都定义了,这样您就不会在奇怪的惊喜中运行。
一般来说,如果您也将Comparable
中的compareTo覆盖到
Comparable
,这是一件好事-例如,在找到领带时,这在内部用于HasMap
。您不必这样做,但如果您计划在地图中使用这些作为键,这不知何故是个好主意。
如我所说,当两个hashCode相等,并且一个HashMap决定移动到一个完全平衡的树节点时,使用tie
,请参见此处或此节点;甚至这个
为什么建议在一个集合中表示多个值关联?(比如说,我为什么不应该使用ArrayList或LinkedList)-
许多关系总是唯一的,在集合中保留重复的值是没有意义的。正如您所知,set始终存储唯一值,因此建议使用set。
在幕后发生了什么,我应该只在使用Set时重写这些方法-
集合只存储唯一的元素。Set在内部使用Hashmap来存储元素。因此,bucket标识是在hashCode()的帮助下完成的,元素是在equals()方法的帮助下进行比较的。