我发现了这个类的定义:
class TwoTuple28<A,B> implements Comparable {
// ...
public int hashCode() {
int result = 17;
result = result * 37 + first.hashCode();
result = result * 37 + second.hashCode();
return result;
}
public int compareTo(Object o) {
if(!(o instanceof TwoTuple28)) throw new ClassCastException();
TwoTuple28 t = (TwoTuple28)o;
return (this.hashCode() - t.hashCode() < 0) ? -1 :
((this.hashCode() - t.hashCode() > 0 ? 1 : 0));
}
请您解释一下,为什么开发人员将hashCode()用于compareTo()?它们有什么关系?这不是一个错误的方式吗?
答案 0 :(得分:1)
简而言之,这是一个非常糟糕的主意。它有点奏效,但会以测试中容易遗漏的方式失败。
比较的目的是说一个物体何时高于,低于或等于另一个物体。当两个对象相等时,它们被认为是ConcurrentSkipListMap,TreeMap和TreeSet的副本,这意味着在这种情况下具有相同hashCode的两个对象将被视为重复并被忽略。两个对象具有相同hashCode的可能性有多大?如果你有一个成千上万的集合,即使你的hashCode比上面的更好,你很可能有重复。
BTW,HashMap和HashSet现在在发生碰撞时使用compareTo
,即使在这些集合中,一个糟糕的比较也可能意味着键/元素消失。
实现此方法的安全方法是假设第一个和第二个字段是Comparable,否则您没有比较它们的基础。
在相关的说明中,给你一个谜题。
编写程序以打印hashCode()
0
的单词字符串。你应该能够在不到十秒的时间内产生数千个。