Java - TreeSet 和 hashCode()
题
我有一个简单的问题 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。