2010-08-05 67 views
1

我遇到了一个关于平等和hashCode合同问题: 这里是等于和hashCode

考虑:

class SortOf { 
    String name; 
    int bal; 
    String code; 
    short rate; 
    public int hashCode() { 
    return (code.length() * bal); 
    } 
    public boolean equals(Object o) { 
    // insert code here 
    } 
} 

以下哪项将履行了equals()和hashCode()合同对于这个 类? (选择所有适用)。

正确答案 C:

return ((SortOf)o).code.length() * ((SortOf)o).bal == this.code.length() * 
    this.bal; 

d:

return ((SortOf)o).code.length() * ((SortOf)o).bal * ((SortOf)o).rate == 
    this.code.length() * this.bal * this.rate; 

我有一个最后的选择d的问题,说如果两个对象

A:code.length = 10,bal = 10,rate = 100

B:code.length = 1 0,bal = 100,rate = 10

然后在D中使用equals()方法,我们得到A.equals(B)求值为true对不对?但是,他们得到一个不同的hashCode,因为他们有不同的余额?是不是我误解了这个概念?有人能为我澄清这一点吗?

回答

4

你说得对 - D会因此而不合适。

更一般地说,hashCodeequals基本上应该考虑相同的领域,以相同的方式。这是一个非常奇怪的实现,当然 - 您通常应该检查每个涉及领域之间的平等。在少数情况下,字段之间可能会相互关联以允许乘法等,但我不希望涉及字符串长度...

经常让人困惑的重要一点是它对于不相等的对象有相同的哈希码;您突出显示的情况(具有不同哈希码的相同对象),这是不可接受的。

0

您必须至少检查.hashCode()所使用的所有字段,以便相同的对象具有相同的散列。但是你可以在equals中检查更多的字段,它完全正确地使用相同的散列表有不同的对象。看来你在做SCJP 1.6?这个主题在Katherine Sierra和Bert Bates的SCJP 1.6书中有很好的介绍。

注:这就是为什么它的合法实施的有用.equals()而从.hashCode()

+0

感谢您的帮助,我想我明白了。 是的,我正在使用该书来研究scjp,并从考试模拟器中获得了这个问题。 – y62wang 2010-08-05 06:35:32

+0

您也可以在Josh Bloch的Effective Java第二版中阅读本主题。非常好的解释! – 2010-08-05 06:44:00

+0

<3有效的java ... – atamanroman 2010-08-05 06:46:29

0

返回一个恒定值,它是所有关于履行合同(就这个问题而言)。不同的实现(hasCode和equal)具有不同的限制和自身的优势 - 所以开发人员可以检查它。

但他们得到不同的hashCode,因为他们有不同的平衡?
正是!但这就是为什么你应该选择选项C.这个问题想测试你对的执行情况,以履行合同概念而不是哪个hascode会更好。

更多澄清:
你需要经常检查的事情是: hashCode()实现应该使用相同的实例变量中equals()方法使用。

下面这些实例变量:code.length()bal中使用的hashCode(),因此你被限制在equals()使用这些相同的变量也是如此。 (除非你可以编辑hashCode()实现并将rate添加到它)

-1

通常,如果在类中重写另一个,则应该总是覆盖一个。如果你不这样做,你可能会发现自己陷入困境时,该类用于hashmaps/hashtables等。

+2

问题不是“我应该重写吗?”,而是关于它们的实现。这回答了一个不同的问题。 – 2014-07-18 08:51:22

+0

对不起菜鸟的错误 – user3774979 2014-07-19 07:14:20