Java - TreeSet和hashCode()

时间:2009-09-24 09:55:48

标签: java hashcode treeset

我对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。有什么想法吗?这真的令人困惑,真的很感激帮助。

4 个答案:

答案 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。