Java – TreeSet和hashCode()

我有一个关于TreeSet集合和hashCode方法的快速问题。 我有一个TreeSet ,我正在添加对象,在添加对象之前,我使用contains方法检查它是否存在于TreeSet contains

我有2个不同的对象,每个对象使用我的hashCode方法实现产生一个不同的hashCode,例如:

 public int hashCode() { int hash = 7; hash = hash * 31 + anAttribute.hashCode(); hash = hash * 31 + anotherAttribute.hashCode(); hash = hash * 31 + yetAnotherAttribute.hashCode(); return hash; } 

特定运行的hashCodes是:76126352和76126353(对象在一个属性中仅相差一位)。

即使hashCodes不同,contains方法也会为这些对象返回true。 有什么想法吗? 这真的令人困惑,真的很感激帮助。

TreeSet根本不使用hashCode 。 它使用compareTo或传递给构造函数的Comparator。 这由像contains这样的方法用于查找集合中的对象。

因此,您的问题的答案是定义了您的compareTo方法或比较器,以便将所讨论的两个对象视为相等。

来自javadocs:

TreeSet实例使用compareTo(或compare)方法执行所有元素比较,因此从集合的角度来看,这个方法认为相等的两个元素是相等的。

来自Java Doc:

如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果。

意思是:用于散列的对象不相等。

您需要阅读Joshua Bloch的“Effective Java”第3章。它解释了equals合约以及如何正确覆盖equals,hashCode和compareTo。

您不需要检查它是否包含,因为insert()在到插入点的路上基本上执行相同的操作(即搜索正确的位置)。 如果无法插入对象(即,对象已被包含),则insert返回false。