我对TreeSet
集合和hashCode
方法有一个简单的问题。在添加对象之前,我有TreeSet
并且我正在添加对象,我使用contains
方法检查TreeSet
中是否存在对象。
我有两个不同的对象,每个对象使用我的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。有什么想法吗?这真的令人困惑,真的很感激帮助。
答案 0 :(得分:40)
TreeSet根本不使用hashCode
。它使用compareTo
或传递给构造函数的Comparator。这由像contains这样的方法用于查找集合中的对象。
因此,您的问题的答案是定义了您的compareTo方法或比较器,以便相关的两个对象被认为是相同的。
来自javadocs:
TreeSet实例执行所有操作 元素比较使用它 compareTo(或者比较)方法,所以两个 被认为是平等的元素 方法是,从的角度来看 设定,平等。
答案 1 :(得分:4)
来自Java Doc:
如果两个对象根据equals(Object)方法相等, 然后必须在两个对象中的每一个上调用hashCode方法 产生相同的整数结果。
表示:用于散列的对象不相等。
答案 2 :(得分:0)
你需要阅读Joshua Bloch的“Effective Java”第3章。它解释了equals合约以及如何正确地覆盖equals,hashCode和compareTo。
答案 3 :(得分:0)
您不需要检查它是否被包含,因为insert()基本上在到插入点的路上执行相同的操作(即搜索正确的位置)。如果无法插入对象(即,对象已经包含),则insert返回false。