hashcode()和compareTo()如何相关?

时间:2016-10-30 18:33:10

标签: java hashcode compareto

我发现了这个类的定义:

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()?它们有什么关系?这不是一个错误的方式吗?

1 个答案:

答案 0 :(得分:1)

简而言之,这是一个非常糟糕的主意。它有点奏效,但会以测试中容易遗漏的方式失败。

比较的目的是说一个物体何时高于,低于或等于另一个物体。当两个对象相等时,它们被认为是ConcurrentSkipListMap,TreeMap和TreeSet的副本,这意味着在这种情况下具有相同hashCode的两个对象将被视为重复并被忽略。两个对象具有相同hashCode的可能性有多大?如果你有一个成千上万的集合,即使你的hashCode比上面的更好,你很可能有重复。

BTW,HashMap和HashSet现在在发生碰撞时使用compareTo,即使在这些集合中,一个糟糕的比较也可能意味着键/元素消失。

实现此方法的安全方法是假设第一个和第二个字段是Comparable,否则您没有比较它们的基础。

在相关的说明中,给你一个谜题。

编写程序以打印hashCode() 0的单词字符串。你应该能够在不到十秒的时间内产生数千个。