代码之家  ›  专栏  ›  技术社区  ›  skip

java:equals和hashcode方法契约

  •  -2
  • skip  · 技术社区  · 6 年前

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

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

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

    它必须返回false。
    它必须是真的。
    它可以返回真或假。
    以上都不是。


    编辑1 以下内容:

    笔者对此的回答和解释如下: 如果类的两个实例具有相同的哈希代码,则它们可能相等,也可能不相等。反之则不然。如果两个对象相等,则它们必须具有相同的hashcode才能符合这些方法的约定。然而,在这种情况下,答案不是上述任何一种,因为该方法不能简单地返回true或false。根据equals()的规则,如果传入null,则结果必须为false。如果传入对象标识,则由于反身性,结果必须是真的。因此,选项d是正确的。


    编辑2 以下内容: 可能是指作者通过其上述解释: 我想也许作者想说如果我们回来 true equals(Object) 那么有可能有人会通过 null 等于(对象) 在这种情况下,它将与返回值相矛盾 基于 无效的 传递的参数返回值应为 false 真的 是的。同样,如果我们返回 那么有可能 Sticker 对象标识被传递,然后它将再次发生冲突。所以基本上我们不能用任何一种方法填空。 真的 .也许这就是为什么作者说答案是D。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Jeutnarg    6 年前

    作者写得很差。从他们的解释中可以明显看出,他们的答案选择最好写成:

    它应该总是返回false。它应该永远是真的。返回真或返回假总是正确的。以上都不是。

    这个问题也可以从重写中受益:

    假设填充空白的代码正确地实现了均等()方法的契约,那么下面的语句总是正确的?

    作者对计算机科学犯了两次严重的违规行为

    1. 关键字冲突 .'return是一个关键字,当您真正的意思是“return correctly”时,使用return是非常愚蠢的。句子= 必须尝试向300人的新生解释指针逻辑 这种特殊的冲突使得它如此不可理解,因为布尔函数显然可以返回true或false。
    2. 布尔逻辑冲突 是的。布尔人可以是真的,也可以是假的。因此,返回布尔值的函数可以始终返回true、始终返回false,或者有时返回一个,有时返回另一个。对布尔问题给出4个答案的选择违反了布尔的本质。滥用关键字“return”使这种违反行为更加严重,但就其本身而言,这应该是一种犯罪。句子= C++程序与实习生,其唯一的CS教育是一种反应。