【问题标题】:Does hashcode number represent the memory address? [duplicate]哈希码是否代表内存地址? [复制]
【发布时间】:2013-05-01 09:17:24
【问题描述】:

我了解到哈希码是一个唯一标识参考号,它是一个十六进制数字。
我的疑问是,引用号是否代表对象的内存地址?

例如:

Employeee e1=new Employee();
System.out.println(e1.hashcode());

这段代码会返回我的对象​​的内存地址吗?

【问题讨论】:

  • 不,它只是一个标识符。
  • 这是该对象的唯一值;它不需要代表内存地址。即使是这样,对你来说意味着什么?你会用这些知识做什么?
  • 不是该对象的唯一值。它只是一个希望尽可能独特的值(如果实施得当)。 Object#hashCode 仅在指针为 32 位时是唯一的。
  • @duffymo 知道哈希码好友,你可以做很多操作。我想你不知道
  • 我相信你会用内存地址做什么,而不是你会用哈希码做什么

标签: java


【解决方案1】:

Hashcode 是 JVM 用于散列以存储和检索对象的数字。例如,当我们在 hashmap 中添加一个对象时,JVM 会查找 hashcode 实现来决定将对象放在内存中的哪个位置。当我们再次检索对象时,哈希码用于获取对象的位置。请注意,哈希码不是实际的内存地址,而是 JVM 从指定位置获取对象的链接,复杂度为 O(1)。

【讨论】:

    【解决方案2】:

    哈希码不是唯一标识。它只是一个帮助您区分物体的数字。两个不同的对象可能有相同的哈希码,这很好。

    哈希码特征:

    1. 如果 obj1 和 obj2 相等,则它们必须具有相同的哈希码。
    2. 如果 obj1 和 obj2 具有相同的哈希码,则它们不必相等。

    【讨论】:

    • 2.不完全是一个规则:)
    • @Michal Borek 我读到只有字符串对象可以具有相同的哈希码,因为它们可能存储在字符串常量池中,其余对象总是具有不同的哈希码?你觉得呢
    • 感谢你们的 cmets 伙计们,我想我需要做更多的研究!
    • @MarkoTopolink 这是由于pidigionhole principle 的规则。您可以创建比可能值更多的对象,当发生这种情况时,两个不相等的对象必须具有相同的哈希码。
    • 2. 是正确的! “根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。但是,程序员应该知道,产生不相等对象的不同整数结果可能会提高哈希表的性能。”请查收:docs.oracle.com/javase/7/docs/api/java/lang/…
    【解决方案3】:

    不一定是内存地址。对于不同的对象,它应该保持不同。但它可能是任何东西。你也可以用你自己的覆盖默认的hashCode 定义。

    【讨论】:

    • 事实上,对于最近的 JVM,默认行为是身份哈希码甚至与内存地址无关。
    【解决方案4】:

    hashCode 是原生实现,在一定程度上提供了内存地址。

    你可以通过任何方式来覆盖它。

    如果你look close at API

    如果两个对象根据equals(Object)方法相等,那么对两个对象中的每一个调用hashCode方法必须产生相同的整数结果。

    我不知道你从其他人的答案中了解多少,但我的疑问在之后很清楚 我读了

    The 3 things you should know about hashCode()@Ralf Sternberg

    【讨论】:

      【解决方案5】:

      对象的哈希码是特定于实现的,但我非常怀疑任何 JVM 实现都会使用内存地址。由于垃圾收集是 Java 的核心特性,这意味着对象可以被移动,从而在其生命周期内拥有不同的内存地址,即使其内容保持不变(这将违反哈希码规范)。

      【讨论】:

      • 它可能是最初有效指针的 int 值。
      • 是的,这是真的——但你永远不能安全地假设hashcode == memory address
      • 当然,尤其是因为指针可以超过 32 位,所以这甚至会排除理论上的机会。
      • @TonythePony 这是否意味着这完全是 BS(他们说这是内存地址)dzone.com/articles/working-with-hashcode-and-equals-in-java
      【解决方案6】:

      简单回答

      A hashcode is an integer value that represents the state of the object upon which it was called. That is why an Integer that is set to 1 will return a hashcode of "1" because an Integer's hashcode and its value are the same thing. A character's hashcode is equal to it's ASCII character code. If you write a custom type you are responsible for creating a good hashCode implementation that will best represent the state of the current instance.

      因此,对于您的班级,您可以实现 hashcode 方法并返回您想要的任何内容。

      【讨论】:

        【解决方案7】:

        如果Employee 类没有覆盖hashCode() 方法,那么它将使用在其超类中定义的方法,可能是Object 类。对象类中的hashCode() 说,

        尽可能实用,由 Object 类定义的 hashCode 方法
        确实为不同的对象返回不同的整数。 (这通常是
        通过将对象的内部地址转换为整数来实现,
        但是 JavaTM 不需要这种实现技术
        编程语言。)

        因此,简而言之,它可能取决于实现,也可能不取决于实现。假设,如果 Employee 类已覆盖 hashCode() 为(虽然不好的做法和无用):

        public int hashCode() {
           return 10;
        }
        

        然后,可以看到这里没有返回内存地址。

        【讨论】:

          【解决方案8】:

          Hashcode 是唯一分配给该对象的 32 位有符号整数。是插入hashmap时hash函数的结果

          【讨论】:

            【解决方案9】:

            根据 Java 文档:

            在合理可行的情况下,Object 类定义的 hashCode 方法确实为不同的对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但 Java 编程语言不需要这种实现技术。)

            【讨论】:

              猜你喜欢
              • 2010-09-28
              • 2011-01-12
              • 1970-01-01
              • 2020-07-27
              • 2011-07-04
              • 1970-01-01
              • 2021-10-20
              • 2011-07-02
              • 2014-02-01
              相关资源
              最近更新 更多