我有一个简单的问题 TreeSet 收藏品和 hashCode 方法。我有一个 TreeSet 我正在向其中添加对象,在添加对象之前,我会检查它是否存在于 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;
}

特定运行的 hashCode 为:76126352 和 76126353(对象仅在一项属性上相差一位数字)。

即使 hashCode 不同, contains 方法也会为这些对象返回 true。有什么想法吗?这确实令人困惑,我们将不胜感激。

有帮助吗?

解决方案

TreeSet中完全不使用hashCode。它采用两种compareTo或者你传递给构造的比较。这是用来通过方法如包含查找该组中的对象。

因此,问题的答案是,你的compareTo方法或您的比较器被限定为使得所讨论的两个对象被认为是相等的。

从javadocs中:

  

一个TreeSet实例执行所有   使用它的元素比较   的compareTo(或比较)的方法,于是两个   被认为等于通过该元件   方法是,从的观点出发   集,相等。

其他提示

从Java文档:

  

如果两个对象根据equals(Object)方法是相等的,       然后调用在每个两个对象的hashCode方法必须       产生相同的整数结果。

表示:您使用散列的对象是不相等的

您需要阅读约书亚布洛赫的“有效的Java”第3章。它说明了equals合同以及如何正确地重写equals,hashCode时和的compareTo。

您不必检查它是否包含,因为insert()基本上做同样的操作(即搜索适当的位置)的道路上插入点。如果该对象不能被插入(即,该对象已经包含),插入件返回false。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top