哈希码编号是否代表内存地址?

时间:2013-05-07 12:10:46

标签: java

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

例如:

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

此代码是否会返回我对象的内存地址?

9 个答案:

答案 0 :(得分:11)

Hashcode不是唯一标识。它只是一个可以帮助您区分对象的数字。两个不同的对象可能具有相同的哈希码,并且没问题。

HashCode特征:

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

答案 1 :(得分:3)

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

答案 2 :(得分:3)

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

As much as is reasonably practical, the hashCode method defined by class Object
does return distinct integers for distinct objects. (This is typically 
implemented by converting the internal address of the object into an integer, 
but this implementation technique is not required by the JavaTM 
programming language.)

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

public int hashCode() {
   return 10;
}

然后,你可以看到它不会在这里返回一个内存地址。

答案 3 :(得分:2)

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

你可以采取任何方式。

如果你look close at API

  

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

我不知道你对别人的答案有多了解,但我的怀疑很明显   我读了

@Ralf Sternberg的

The 3 things you should know about hashCode()

答案 4 :(得分: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方法并返回您想要的任何内容。

答案 5 :(得分:2)

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

答案 6 :(得分:1)

根据Java文档:

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

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