gpt4 book ai didi

java - hashCode()在Java中是如何实现的

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:41:06 24 4
gpt4 key购买 nike

如何hashCode()实现了吗?

我的假设是它使用对象内存位置作为运行哈希函数的初始数字(种子)。然而,事实并非如此。

我也看过 Hash : How does it work internally?但它没有回答我的问题。

是的,我可以下载 SDK,但在我这样做并查看代码之前,也许其他人已经了解它。

谢谢:)

编辑:我知道它应该被覆盖等等,所以请尽量留在主题上:)

最佳答案

不,不,不。此线程中的所有答案都是错误的,或者至少只是部分正确。

首先:Object.hashCode() 是一种本地方法,因此其实现完全依赖于 JVM。它可能在 HotSpot 之间变化和其他 VM 实现,如 JRockitIBM J9 .

如果你问:

how is hashCode() implemented in Java?

那么答案是:这取决于您使用的是哪个虚拟机。

假设您使用的是 Oracle 的默认 JVM — HotSpot,那么我可以告诉您 HotSpot 有六个 hashCode() 实现。您可以使用通过命令行运行 JVM 的 -XX:hashCode=n 标志来选择它,其中 n 可以是:

0 – Park-Miller RNG (default)
1 – f(address, global_statement)
2 – constant 1
3 – Serial counter
4 – Object address
5 – Thread-local Xorshift

以上内容复制自this post .

如果您仔细研究 HotSpot 源代码,您可能会发现以下片段:

if (hashCode == 0) {
value = os::random();
} else {
...

os::random() 只是 Park-Miller 伪随机生成器算法的实现。

就是这样。 没有任何内存地址的概念。虽然另外两个实现,14,使用对象的内存地址,但默认的不使用它。
Object.hashCode() 基于对象地址的概念主要是 historic artefact - 这不再是真的。


我知道在 Object#hashCode() JavaDoc 中我们可以阅读:

(...) this is typically implemented by converting the internal address of the object into an integer, but this implementation technique is not required by the Java™ programming language.

但它已经过时且具有误导性。

关于java - hashCode()在Java中是如何实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10106802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com