gpt4 book ai didi

java - 为什么 Object.hashCode() 在运行中返回相同的值

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:39:58 25 4
gpt4 key购买 nike

hashCode() 的默认实现在 HotSpot 上返回 random value并将其存储在对象头中。这在Java 8 中似乎没有改变。其中哈希值是通过调用 os::random() 计算得出的:

static inline intptr_t get_next_hash(Thread * Self, oop obj) {
intptr_t value = 0 ;
if (hashCode == 0) {
// This form uses an unguarded global Park-Miller RNG,
// so it's possible for two threads to race and generate the same RNG.
// On MP system we'll have lots of RW access to a global, so the
// mechanism induces lots of coherency traffic.
value = os::random() ;
} else
...

我想知道为什么 hashCode()不断返回相同的值,在关闭我通过执行下面的简单测试尝试的 JVM 之后,重新启动我的机器然后运行 ​​main() 也是如此。再次。

public class SimpleTest {
public static void main(String[] args) {
Object obj = new Object();
// This calls toString() which calls hashCode() which calls os::random()
System.out.println(obj);
}
}

如果hashCode(),输出怎么每次都一样?实际上是 os::random()


java -version

java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b25)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

注意事项:

有人应该问自己什么 System.out.println(obj); ,它调用 obj.toString()如果对象是非空的并产生类似 java.lang.Object@659e0bfd 的东西, 与 hashCode() 有关: @ 之后的部分是对象的十六进制哈希码(并且与对象在内存中的位置无关,contrary 与文档所建议的一样,这导致了 misunderstandings )。

最佳答案

确定性行为使代码更易于调试,因为它可以被复制。因此,实现往往会尽可能选择它。想象一下,如果哈希值每次都不同,那么复制一些由于哈希值冲突处理不当(例如,在减少哈希值长度后)而失败的单元测试会有多困难。

关于java - 为什么 Object.hashCode() 在运行中返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29290093/

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