Java Object.hashCode()-地址还是随机()?
我试图理解Java Object.hashCode()-地址还是随机()?,java,Java,我试图理解hashCode()方法的本机实现。这个方法究竟返回什么?它是内存地址还是随机值?来自: 只要是合理可行的,类对象定义的hashCode方法确实会为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要这种实现技术。) 因此,它可能与内存地址有关,但不一定非得如此,而且你绝对不应该假设它与内存有关 对哈希代码所做的任何事情都不应该关心这一点。您应该从哈希代码中推断出的唯一内容是: 如果两个对象的哈希代码相同,则它们可能是相等的对象 如果两
hashCode()
方法的本机实现。这个方法究竟返回什么?它是内存地址还是随机值?来自:
只要是合理可行的,类对象定义的hashCode方法确实会为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要这种实现技术。)
因此,它可能与内存地址有关,但不一定非得如此,而且你绝对不应该假设它与内存有关
对哈希代码所做的任何事情都不应该关心这一点。您应该从哈希代码中推断出的唯一内容是:
- 如果两个对象的哈希代码相同,则它们可能是相等的对象
- 如果两个对象的哈希代码不同,则它们不是相等的对象(假定实现正确,无论是否被重写)
- 你的答案是谎言。如文件中所述:
只要是合理可行的,类对象定义的hashCode方法确实会为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要这种实现技术。)
。hashCode()
本机实现取决于JVM
例如,HotSpot有6个Object.hashCode()实现。您可以通过命令行使用运行JVM的-XX:hashCode=n
标志来选择它,其中n:
0–公园米勒RNG(默认值)1-f(地址、全球声明)
2–常数1
3–串行计数器
4–对象地址
5–螺纹局部异或移位
OpenJDK源代码应该告诉您。我怀疑它是一个内存地址,因为GC可以在内存中移动对象,它可能是某种内部对象句柄。这是2008年左右所说代码的摘录:直接从马口铁上说:我觉得代码和博客文章中的代码一样。可能是GC的重复,散列码甚至可以作为内存地址吗?在哈希表中使用时,它不应该在执行过程中发生不可预测的变化。@millimoose:在压缩GC时,它绝对不能是当前内存地址。但它可能是“第一次打电话时的地址,以后会被记住”。我试着不太在意:)就我所能读到的有点毛茸茸的C而言,这显然是“一个一旦保存就确定的数字”。有六种实现可用,包括初始内存地址和一个RNG。@GaborSch First of:哈希代码不能保证是唯一的。第二:该实现可能不会真正用于“真正的”VM,因为它仍然存在哈希代码是(相对较小的)Eden空间中的地址的问题。@millimoose抱歉,我错了,根本不需要唯一性。如果您有足够大的Eden空间(或JVM正在使用的任何空间),则散列值可能分布得很好。值得注意的是,由于对象头中存储内容的空间有限,因此默认的散列代码仅为int的32位,而不是int的全部32位。