hashCode()和==可以发散而不覆盖hashCode

时间:2018-08-15 17:32:21

标签: java

给出Java Object#hashCode文档快照:

  

在合理可行的范围内,由   Object类确实为不同的对象返回不同的整数。 (   hashCode可能会或可能不会作为对象的某些功能实现   内存地址。)

我们如何使该方法在不重载hashCode()方法的情况下返回正确的

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

否则,使此方法返回true:

boolean makeMeReturnTrue(Object o1, Object o2) {
    return o1 == o2 && System.identityHashCode(o1) != System.identityHashCode(o2);
}

4 个答案:

答案 0 :(得分:4)

你不能。

如果filename-fs8.png,则{ "name": "Nasdaq_Webhook", "event_type": "response_completed", "object_type": "survey", "object_ids": ["155794502"], "subscription_url": "https://e2-impl-cci.workday.com/ccx/cc-cloud-repo/launches/INT057_Test/INT057_Test/StartHere" } 肯定会返回与o1 == o2相同的值,这将使表达式返回o1.hashCode()

o2.hashCode()的属性之一是一致性,这意味着在同一程序内,false在同一对象上的结果不应更改(更改返回值是唯一的方法表达式return hashCode()-但您无法获得hashCode()返回无关紧要的值,因此您将不得不覆盖true来自己破坏合同)。

答案 1 :(得分:3)

return o1 == o2 && o1.hashCode() != o2.hashCode();

表达式o1 == o2测试o1和o2以查看它们是否引用相同的对象。不是相等比较的两个对象,而是实际相同的对象。因此,o1 == o2仅在o1o2引用同一对象时才为真。

鉴于o1和o2必须是同一对象,o1.hashCode() != o2.hashCode()成立的唯一方法是,如果相关的hashCode()方法每次调用都返回不同的值。例如,如果hashCode()每次被调用时都返回一个随机值,则该表达式可能为true。这违反了对hashCode()的期望,但是如果您愿意的话,您当然可以编写不合格的hashCode()方法。

答案 2 :(得分:0)

好吧,它将取决于传入的最终对象的hashCode()equals()的实际实现。看起来您的类具有一个实现,其中等式代表“我们包含相同的数据”,但您似乎希望哈希代码实现基于内存地址或其他“对于此实例而言是唯一的”标识符,以便某些内容不会挑战自己。

您始终可以自己管理该标识符,这将是最安全的(例如,由于在主要Java版本更新期间,hashCode()的基础实现可能会在通用数据结构的默认版本上发生更改),但是它可能会太过分了。

答案 3 :(得分:-2)

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