我有一个简单的问题TreeSet http://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html收藏品和hashCode http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--方法。我有一个TreeSet
我正在向其中添加对象,在添加对象之前,我会检查它是否存在于TreeSet
使用contains http://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html#contains-java.lang.Object- method.
我有 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
或您传递给构造函数的比较器。它被 contains 之类的方法用来查找集合中的对象。
所以你的问题的答案是你的compareTo方法或你的Comparator被定义,以便有问题的两个对象被认为是相等的。
来自javadoc:
TreeSet 实例执行所有操作
使用其元素比较
CompareTo(或比较)方法,所以两个
被视为相等的元素
方法是,从
设,相等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)