java不同的枚举哈希代码生成?
为什么每次运行java main时都有不同的hashCode值? 查看下面的示例代码
interface testInt{
public int getValue();
}
enum test implements testInt{
A( 1 ),
B( 2 );
private int value;
private test( int value ) {
this.value = value;
}
public int getValue() {
return this.value;
}
}
每次你跑步
public static void main( String[] args ) {
System.out.println( test.A.hashCode() );
}
控制台上将有不同的打印值。 为什么不一致
# 1 楼答案
“不要求散列值在不同Java实现之间保持一致,甚至在同一程序的不同执行运行之间保持一致。”
http://en.wikipedia.org/wiki/Java_hashCode%28%29
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html#hashCode%28%29
此代码现在将生成相同的哈希代码
# 2 楼答案
Enum.hashCode
没有定义为返回任何特定的值(除了遵守Object.hashCode
的规则之外),并且通用实现没有做任何特殊的事情为什么??如果您在
HashSet
中使用枚举(仅)或作为HashMap
中的键,那么您应该使用优化的EnumSet
或EnumMap
。现在考虑EnUM是否与其他类型一起使用在^ {CD3}}中。也许您有一些“标准选项”来实现一个接口,但是其他人可以提供他们自己的选项。任何无状态的东西都可以。一个HashSet
中有多个枚举类型。如果Enum
对散列值使用了序数,那么将出现常见冲突。使用System.identityHashCode
以稳健的方式减少冲突我们真的不想要
A.hashCode() == P.hashCode() == X.hashCode()
# 3 楼答案
也许一些JVM实现基本上返回了^{} (这也会使} 的JavaDocs中描述,在
hashCode
变得很棒),但它不会有效地改变任何东西hashCode()
值不必在执行或JVM之间保持一致。唯一需要的契约在^{Object
中使用的是enum
中的实现还要注意,实现接口与
hashCode()
无关:这个程序在每次运行时也返回不同的
hashCode()
# 4 楼答案
javadocs清楚地说明了这一点。从javadocs获取对象c中的哈希代码方法 阶级
因此,在演示代码的不同运行过程中,内部地址可能会有所不同,因此您看到不同的值是完全正常的
根据需要,如果希望hashcode()方法在jvm调用中返回相同的值,则应重写该方法以返回自定义值。但是,您应该知道,如果要在基于散列的集合中使用对象,这可能是灾难性的(增加了散列冲突的可能性)
# 5 楼答案
如果每次都想要相同的值,请使用
.ordinal()
,或者更好地使用getValue()
。您可以覆盖hashCode()的默认值,即根据对象的创建方式为其指定一个数字