据我所知,Object.hashCode()
方法已实施native
。我特别感兴趣的是:这种方法有任何随机化吗?
我没有重新定义hashCode
方法从Object.class直接派生类。如果我错了,请纠正我,但当我们调用==
运算符时,我们会比较这些对象的引用,别名比较哈希码。
所以我们总是得到false
//pseudocode
new SomeObject(3) == new SomeObject(3)
因为Object.hashCode()
方法涉及随机化?
答案 0 :(得分:3)
对象hascode只是hash,而不是指针。因此==
将比较引用而不是哈希码。
来自spec的hashCode的一般合约是:
每当在同一个对象上多次调用它时 执行Java应用程序时,hashCode方法必须始终如一 返回相同的整数,前提是equals中没有使用的信息 对象的比较被修改。不需要保留该整数 从一个应用程序的执行到另一个执行的一致性 相同的申请。
如果两个物体相等则 equals(Object)方法,然后在每个上调用hashCode方法 两个对象必须产生相同的整数结果。
不需要 如果两个对象根据不相等而不相等 equals(java.lang.Object)方法,然后调用hashCode方法 两个对象中的每一个都必须产生不同的整数结果。 但是,程序员应该意识到产生了不同的 不等对象的整数结果可以提高性能 哈希表。
关键字native
告诉我们使用JNI(Java Native Interface)在本机代码上完成实现。
此外,如果您重写hashcode
方法,请不要忘记您的实现应该满足上述合同,否则您可能会得到错误的输出,使用它。说HashMap
类。
更多信息:What issues should be considered when overriding equals and hashCode in Java?
答案 1 :(得分:1)
据我所知,Object.hashCode()类是原生的。
正确。
我特别感兴趣的是:这种方法有任何随机化吗?
Object.hashCose()
IS 返回的哈希码,通常是,基于对象在其生命周期中某个时间的机器地址。地址以及哈希码可能会受到各种随机因素的影响,具体取决于应用程序。
但是,这并不意味着哈希码是随机的。实际上,如果你一个接一个地分配了两个对象并且立即获得了它们的哈希码,那么可能两个哈希码之间会有很强的相关性。
可能......但不能保证。
如果我错了,请纠正我,但当我们调用==运算符时,我们会比较这些对象的引用。
正确。
...别名比较哈希码。
如果你说==
涉及哈希码,那就是不正确。 ==
是通过比较对象的当前机器地址来实现的。
因为Object.hashCode()方法涉及随机化,所以我们总是会弄错吗?
没有。在您的示例中,您得到false
因为对象引用不同!
实际上,两个不同的Object
实例可能具有相同的哈希码。
o1 == o2 IMPLIES o1.hashcode() == o2.hashcode() is TRUE
o1.hashcode() == o2.hashcode() IMPLIES o1 == o2 is FALSE