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

hashCode()和==在不重写hashCode的情况下可以分开吗

  •  0
  • Bax  · 技术社区  · 7 年前

    给定的java Object#hashCode

    在合理可行的情况下,hashCode方法由 hashCode可以实现为对象的某个函数,也可以不实现

    我们如何使这个方法返回true 不覆盖 这个 hashCode()

    boolean challenge(Object o1, Object o2) {
        return o1 == o2 && o1.hashCode() != o2.hashCode();
    }
    

    另有说明,使此方法返回真值:

    boolean makeMeReturnTrue(Object o1, Object o2) {
        return o1 == o2 && System.identityHashCode(o1) != System.identityHashCode(o2);
    }
    
    4 回复  |  直到 7 年前
        1
  •  4
  •   ernest_k Petronella    7 年前

    o1 == o2 ,那么 o1.hashCode() 一定会返回与相同的值 o2.hashCode() ,这将使表达式返回 false

    hashCode() 在同一个对象上不应更改(更改返回值是使表达式返回的唯一方法) true Object.equals 返回不一致的值,因此您将被迫重写 hashCode 为自己解约)。

        2
  •  3
  •   Kenster marc_s    7 年前
    return o1 == o2 && o1.hashCode() != o2.hashCode();
    

    o1 == o2 测试o1和o2,看它们是否指向同一物体。不是两个比较相等的对象,而是实际相同的对象。所以 o1==o2 只有在 o1 o2 引用同一对象。

    假设o1和o2必须是同一个物体 o1.hashCode() != o2.hashCode() 如果是真的 hashCode() 方法每次调用时返回不同的值。例如,如果 哈希代码() 每次调用时都返回一个随机值。这违背了对 哈希代码() 如果你愿意的话。

        3
  •  0
  •   Taormina    7 年前

    好吧,这取决于 hashCode() equals() 对于传入的最终对象。看起来您的类有一个实现,其中equality表示“我们包含相同的数据”,但您似乎希望哈希代码实现基于内存地址或其他“唯一于此实例化”的标识符,这样就不会有东西挑战自己。

    您可以始终自己管理该标识符,这将是最安全的(因为 哈希代码()

        4
  •  -2
  •   Yanish Pradhananga    6 年前

    只需下载openJDK并根据需要修改代码。会有用的。但它只能在您自己通过修改OpenJDK创建的自定义JDK中工作。在需要部署应用程序的地方使用定制的JDK。