我得到了两个整数在测试箱中解决的问题:
:public class Test {
private final static Logger log = LoggerFactory.getLogger(Test.class);
private final static LinkedHashMap<Integer,Integer> map = new LinkedHashMap<Integer,Integer>();
/**
* @param args
*/
public static void main(String[] args) {
int j=0;
for(int i=0;i<10000;i++){
++j;
int hash = System.identityHashCode(i);
if(map.containsKey(hash)){
log.info("hashcode of key "+i+" was conflict with "+map.get(hash)+" hashcode was:"+hash);
}else{
map.put(hash, i);
}
}
log.info("length of map:"+map.size()+" expected:"+j);
}
}
输出如下:
2014-02-08 12:10:59,723 [main] INFO: hashcode of key 1947 was conflict with 422 hashcode was:9578500 <reactive.lib.Test>
2014-02-08 12:10:59,725 [main] INFO: hashcode of key 2246 was conflict with 1966 hashcode was:14850080 <reactive.lib.Test>
2014-02-08 12:10:59,736 [main] INFO: length of map:9998 expected:10000 <reactive.lib.Test>
我希望所有整数都有独特的主题 - 有人可以解释吗?如果有帮助,此测试在Windows上的JDK1.6下。
您正在使用System.identityHashCode
:
返回给定对象的同一哈希代码与将要返回 通过默认方法hashcode(),是否给定对象 类覆盖HashCode()。
对于Integer
,它覆盖了hashCode()
,因此每个值的HashCode等于其INT值。通过使用此功能而不是hashCode()
,您可能会得到更多的碰撞。
通常,允许哈希代码是非唯一的 - hashCode()
可能返回所有对象的1,并且仍然有效。只需要需要返回相等的对象的相同数字,并且建议它们尽可能地使使用Hashtables更有效。
来自Javadoc:
每当在同一对象上调用多次 执行Java应用程序,HashCode方法必须始终如一 返回相同的整数,没有提供等于 修改对象上的比较。这个整数不必保留 从一个执行应用程序到另一个执行 同一应用程序。
如果两个对象根据等于(对象)方法相等,则 在两个对象中的每个对象上调用hashCode方法必须产生 相同的整数结果。
不需要,如果两个对象不平等 equals(java.lang.object)方法,然后在上调用HashCode方法 两个对象中的每个对象都必须产生不同的整数结果。 但是,程序员应意识到,产生独特的 整数结果不平等物体可能会提高性能 哈希表。