两个整数解决了Java(Windows Platform)的同一哈希码



我得到了两个整数在测试箱中解决的问题:

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方法 两个对象中的每个对象都必须产生不同的整数结果。 但是,程序员应意识到,产生独特的 整数结果不平等物体可能会提高性能 哈希表。

相关内容

  • 没有找到相关文章

最新更新