Java:等于和hashCode方法协定

时间:2018-09-07 16:05:27

标签: java equals hashcode

问题的作者说答案是D,但我想知道为什么答案不应该是C?

问:关于可以填空的代码,哪种说法正确?

class Sticker {
  public int hashCode() {
    return 1;
  }
  public boolean equals(Object o) {
    return____________ ;
 }
}

A。它必须返回false。
B.必须返回true。
C.它可以返回true或false。
D.以上都不是。


编辑1

作者给出的答案和解释如下: 如果一个类的两个实例具有相同的哈希码,则它们可能相等,也可能不相等。反之则不成立。如果两个对象相等,则它们必须具有相同的哈希码,以便遵守这些方法的约定。但是,在这种情况下,答案并非以上所有,因为该方法不能简单地返回true或false。根据equals()的规则,如果传入null,则结果必须为false。如果传入对象标识,则由于反射性,结果必须为true。结果,选项D是正确的。


编辑2 : 可能是作者通过上面给出的解释表示以下内容: 我想可能是作者想说的是,如果我们从true返回equals(Object),那么在这种情况下,有人可能会在null中通过equals(Object)基于传递的true参数,返回值null将与返回值相矛盾,返回值应为false而不是true。同样,如果我们返回false,则很可能传递了Sticker对象标识,这又将导致矛盾。因此,基本上我们不能用truefalse来填补空白。也许就是为什么作者说答案是D。

1 个答案:

答案 0 :(得分:3)

作者的回答选项写得不好。从他们的解释很明显,他们的答案选择最好写成:

  

A。它应该始终返回false。 B.它应始终返回true。 C.返回true或返回false总是正确的。 D.以上都不是。

该问题可能还受益于重写:

  

假设代码中的空白正确地满足了equals()方法的约定,那么下面哪条语句始终是正确的?

作者对计算机科学犯下了两项严重罪行

  1. 违反关键字。 “ Return”是一个关键字,当您真正要说“正确返回”时,使用“ return”绝对是愚蠢的。 Sentence = 必须尝试解释300位新生类的指针逻辑。由于布尔函数显然可以返回true或false,因此这种特殊的冲突令人难以理解。
  2. 违反布尔逻辑。布尔值可以为true或false。因此,返回布尔值的函数可以总是返回true,总是返回false,或者有时返回一个,有时返回另一个。对布尔问题给出4个答案选择违反了布尔的本质。滥用关键字“ return”会加剧这种违规行为,但其本身应构成犯罪。 Sentence = pair程序,在C ++中有一个实习生,其唯一的CS教育是React训练营