是的输出Object.hashCode()
是对所有的JVM实现相同的对象相同的要求?
例如,如果"test".hashCode()
返回1
上1.4,可能它潜在地返回2
上1.6上运行。 或者,如果什么操作系统是不同的,或有实例之间的不同的处理器架构?
是的输出Object.hashCode()
是对所有的JVM实现相同的对象相同的要求?
例如,如果"test".hashCode()
返回1
上1.4,可能它潜在地返回2
上1.6上运行。 或者,如果什么操作系统是不同的,或有实例之间的不同的处理器架构?
号的输出hashCode
易于JVM实现之间,甚至在相同的JVM中的程序的不同的执行之间改变。
然而,在你给了具体的例子,值"test".hashCode()
实际上是一致的,因为实施hashCode
的String
对象是的API的一部分String
(见的Javadoc java.lang.String中和该其他SO后 )。
从API
hashCode的一般合同是:
尽可能合理地实用,由Object类定义的hashCode方法不会返回针对不同的对象不同的整数。 (这一般是通过将该对象的内部地址转换成一个整数来实现的,但不是由的JavaTM编程语言不需要这种实现技巧。)
否,结果hashCode()
是一个单一的执行期间只恒定。 你不应该指望函数的结果是执行之间的相同,更不用说JRE版本或平台之间。
首先,hashCode的结果很大程度上取决于对象类型和其执行情况。 每一个包括其子类可以定义自己的行为。 你可以在javadoc的,以及在其他的答案中概述的总承包合同下依靠它。 但不需要值VM重新启动后保持不变。 尤其是如果它取决于THRID党类的.hashCode实现。
指的是具体的实现String类的时候,你不应该依赖于返回值。 如果你的程序在不同的虚拟机执行,它可能会改变。
如果你仅仅指的是太阳的VM,它可以说,Sun将不会打破 - 甚至是严重的程序 - 现有的代码。 这样的“测试” .hashCode()将始终只返回3556498为Sun VM的任何版本 。
如果你想deliberatly搬起石头砸自己的脚,继续前进,取决于此。 人谁需要修复您的代码在“2015年任天堂的Java虚拟机的吹风机”运行后会在晚上哭你的名字。
如上所述,对于许多实现的hashCode()的默认行为是返回对象的地址。 显然,这对每一个程序运行时,可以是不同的。 这也是与equals()的默认行为是一致的:两个对象只有当它们是同一个对象相等(其中x和y都是非空,x.equals(Y),当且仅当x == Y) 。
对于其中hashCode()和equals()方法被覆盖的任何类,通常它们在基于对一些或所有的成员的值以确定的方式来计算。 因此,在实践中,很可能是,如果在程序中的一个运行的对象,可以说为等于在程序中的另一个运行的对象,并且在源代码是相同的(包括诸如用于字符串的源代码.hashCode()如果由哈希码()重写称为),散列代码将是相同的。
它不能保证,虽然这是很难想象一个合理的现实世界的例子。
唯一的真理:哈希码是应用程序运行一样。 另一种运行可能会给其他哈希码。
当你问对象的哈希码,JVM创建它使用的RNG算法中的一个,并将其放在对象的标题以供将来使用。 只要观察一下get_next_hash在OpenJDK的功能。
该RNG算法是用JVM ARG -XX配置的:的hashCode = x,其中x是一个数字:
0 - 公园 - 米勒RNG(默认)
1 - F(地址,全球)
2 - 1恒定
3 - 顺序计数器
4 - 对象在堆地址
5 - Xorshift(最快)
当哈希码堆等于地址 - 这有时是尴尬,因为GC可以将对象移动到另一个堆细胞等。