7

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

例如:

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

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

4

9 回答 9

12

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

哈希码特性:

  1. 如果 obj1 和 obj2 相等,则它们必须具有相同的哈希码。
  2. 如果 obj1 和 obj2 具有相同的哈希码,则它们不必相等。
于 2013-05-07T12:11:59.150 回答
3

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

于 2013-05-07T12:12:41.593 回答
3

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

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

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

public int hashCode() {
   return 10;
}

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

于 2013-05-07T12:13:49.390 回答
3

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

于 2013-05-07T12:15:19.950 回答
2

hashCode是在一定程度上提供内存地址的本机实现。

任何可以超越它的方法。

如果您 仔细查看 API

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

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

@Ralf Sternberg关于 hashCode() 你应该知道的 3 件事

于 2013-05-07T12:14:05.293 回答
2

简单回答

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 方法并返回您想要的任何内容。

于 2013-05-07T12:15:03.503 回答
1

根据Java文档:

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

于 2013-05-07T12:13:28.437 回答
1

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

于 2013-05-07T12:15:49.280 回答
0

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

于 2013-05-07T12:13:40.920 回答