提问者:小点点

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


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

于是问题出现了:

>

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


共2个答案

匿名用户

那么,HashSet如何推导等式呢?这是基于hashCode/equals。对于集合您需要两种方法,因为列表仅使用equals(例如在包含的方法中),但它们都定义了,这样您就不会在奇怪的惊喜中运行。

一般来说,如果您也将Comparable中的compareTo覆盖到Comparable,这是一件好事-例如,在找到领带时,这在内部用于HasMap。您不必这样做,但如果您计划在地图中使用这些作为键,这不知何故是个好主意。

如我所说,当两个hashCode相等,并且一个HashMap决定移动到一个完全平衡的树节点时,使用tie,请参见此处或此节点;甚至这个

匿名用户

为什么建议在一个集合中表示多个值关联?(比如说,我为什么不应该使用ArrayList或LinkedList)-

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

在幕后发生了什么,我应该只在使用Set时重写这些方法-

集合只存储唯一的元素。Set在内部使用Hashmap来存储元素。因此,bucket标识是在hashCode()的帮助下完成的,元素是在equals()方法的帮助下进行比较的。