Java - TreeSet and hashCode()

2022-09-02 00:27:20

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

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

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

特定运行的哈希代码是:76126352和76126353(对象在一个属性中仅相差一位数字)。

contains 方法对这些对象返回 true,即使哈希代码不同也是如此。任何想法为什么?这真的很令人困惑,帮助将不胜感激。


答案 1

树集根本不使用。它使用您传递给构造函数的比较器或比较器。这由包含等方法用于查找集合中的对象。hashCodecompareTo

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

来自 javadocs:

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


答案 2

来自 Java Doc:

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

均值:用于哈希的对象不相等。