给出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);
}
答案 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
仅在o1
和o2
引用同一对象时才为真。
鉴于o1和o2必须是同一对象,o1.hashCode() != o2.hashCode()
成立的唯一方法是,如果相关的hashCode()
方法每次调用都返回不同的值。例如,如果hashCode()
每次被调用时都返回一个随机值,则该表达式可能为true。这违反了对hashCode()
的期望,但是如果您愿意的话,您当然可以编写不合格的hashCode()
方法。
答案 2 :(得分:0)
好吧,它将取决于传入的最终对象的hashCode()
和equals()
的实际实现。看起来您的类具有一个实现,其中等式代表“我们包含相同的数据”,但您似乎希望哈希代码实现基于内存地址或其他“对于此实例而言是唯一的”标识符,以便某些内容不会挑战自己。
您始终可以自己管理该标识符,这将是最安全的(例如,由于在主要Java版本更新期间,hashCode()
的基础实现可能会在通用数据结构的默认版本上发生更改),但是它可能会太过分了。
答案 3 :(得分:-2)
只需下载openJDK并根据您的要求修改代码。会的但是它只能在通过修改OpenJDK创建的自定义JDK中使用。在需要部署应用程序的地方使用自定义JDK。