Java中,是Object.hashCode()的结果在所有的JVM /系统常数?(Java, Ob

2019-07-20 20:12发布

是的输出Object.hashCode()是对所有的JVM实现相同的对象相同的要求?

例如,如果"test".hashCode()返回1上1.4,可能它潜在地返回2上1.6上运行。 或者,如果什么操作系统是不同的,或有实例之间的不同的处理器架构?

Answer 1:

号的输出hashCode易于JVM实现之间,甚至在相同的JVM中的程序的不同的执行之间改变。

然而,在你给了具体的例子,值"test".hashCode() 实际上是一致的,因为实施hashCodeString对象是的API的一部分String (见的Javadoc java.lang.String中和该其他SO后 )。



Answer 2:

从API

hashCode的一般合同是:

  • 每当它是一个Java应用程序的执行期间,在同一对象上调用一次以上,hashCode方法必须一致地返回相同的整数,没有设置中使用的信息等于在对象上比较被修改。 该整数不必从一个应用的执行保持一致,以同一应用程序的另一执行。
  • 如果两个对象根据equals(Object)方法是相等的,则调用在每个两个对象的hashCode方法必须产生相同的整数结果。
  • 这不是必需的:如果两个对象根据equals(java.lang.Object)方法是不相等的,然后调用hashCode方法在各两个对象的必须产生不同的整数结果。 但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

尽可能合理地实用,由Object类定义的hashCode方法不会返回针对不同的对象不同的整数。 (这一般是通过将该对象的内部地址转换成一个整数来实现的,但不是由的JavaTM编程语言不需要这种实现技巧。)



Answer 3:

否,结果hashCode()是一个单一的执行期间恒定。 你不应该指望函数的结果是执行之间的相同,更不用说JRE版本或平台之间。



Answer 4:

首先,hashCode的结果很大程度上取决于对象类型和其执行情况。 每一个包括其子类可以定义自己的行为。 你可以在javadoc的,以及在其他的答案中概述的总承包合同下依靠它。 但不需要值VM重新启动后保持不变。 尤其是如果它取决于THRID党类的.hashCode实现。

指的是具体的实现String类的时候,你不应该依赖于返回值。 如果你的程序在不同的虚拟机执行,它可能会改变。

如果你仅仅指的是太阳的VM,它可以说,Sun将不会打破 - 甚至是严重的程序 - 现有的代码。 这样的“测试” .hashCode()将始终只返回3556498为Sun VM的任何版本

如果你想deliberatly搬起石头砸自己的脚,继续前进,取决于此。 人谁需要修复您的代码在“2015年任天堂的Java虚拟机的吹风机”运行后会在晚上哭你的名字。



Answer 5:

如上所述,对于许多实现的hashCode()的默认行为是返回对象的地址。 显然,这对每一个程序运行时,可以是不同的。 这也是与equals()的默认行为是一致的:两个对象只有当它们是同一个对象相等(其中x和y都是非空,x.equals(Y),当且仅当x == Y) 。

对于其中hashCode()和equals()方法被覆盖的任何类,通常它们在基于对一些或所有的成员的值以确定的方式来计算。 因此,在实践中,很可能是,如果在程序中的一个运行的对象,可以说为等于在程序中的另一个运行的对象,并且在源代码是相同的(包括诸如用于字符串的源代码.hashCode()如果由哈希码()重写称为),散列代码将是相同的。

它不能保证,虽然这是很难想象一个合理的现实世界的例子。



Answer 6:

唯一的真理:哈希码是应用程序运行一样。 另一种运行可能会给其他哈希码。

当你问对象的哈希码,JVM创建它使用的RNG算法中的一个,并将其放在对象的标题以供将来使用。 只要观察一下get_next_hash在OpenJDK的功能。

该RNG算法是用JVM ARG -XX配置的:的hashCode = x,其中x是一个数字:

0 - 公园 - 米勒RNG(默认)

1 - F(地址,全球)

2 - 1恒定

3 - 顺序计数器

4 - 对象在堆地址

5 - Xorshift(最快)

当哈希码堆等于地址 - 这有时是尴尬,因为GC可以将对象移动到另一个堆细胞等。



文章来源: Java, Object.hashCode() result constant across all JVMs/Systems?
标签: java hashcode