Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Object.hashCode()-地址还是随机()?_Java - Fatal编程技术网

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位。