2016-10-30 27 views
0

我发现这个类的定义: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()?他们有什么关系?这不是一个错误的方式?

+2

他们没有关系。这是做错的方法。 – 4castle

+0

我认为你找到的代码非常可怕。 – GhostCat

回答

1

总之,这是一个非常糟糕的主意。它有点作品,但会以很容易在测试中遗漏的方式失败。

比较的目的是说当一个对象更高,更低或等于另一个时。当两个对象相等时,它们被认为是ConcurrentSkipListMap,TreeMap和TreeSet的重复对象,这意味着在这种情况下具有相同hashCode的两个对象将被认为是重复的并被忽略。两个对象具有相同的hashCode的可能性有多大?如果您拥有数以万计的集合,那么即使使用比以上更好的hashCode,您也很可能会有重复。

当碰撞时,BTW,HashMap和HashSet现在使用compareTo,即使在这些集合中,compareTo也可能意味着键/元素消失。

实现此方法的安全方法是假定第一个和第二个字段为Comparable,否则您无法比较它们。


在一个相关的说明,为你一个难题。

编写一个程序来打印有hashCode()0的字符串。您应该能够在不到十秒的时间内生成数千个数据。