Java hashMap的哈希如何保证不超过8次冲突?

Java hashMap的哈希如何保证不超过8次冲突?,java,Java,我在问专家,所以不需要简单的答案。 在HashMap的hash方法的描述中说: 此函数可确保hashCodes中只有 每个位位置的常量倍数有一个有界值 碰撞数(默认负载系数下约为8) 但他们是如何做到这一点的?该方法显示确定性行为-如果将相同的hashCode作为参数传递,则得到相同的结果。因此,如果您将超过8个对象作为贴图的关键点传递(并且如果您没有重叠负载因子),它们将被放在同一个bucket中。那么,该方法如何保证有限的碰撞次数呢 为了测试我是否正确,我使用了这个。假设我们想要一个32大小

我在问专家,所以不需要简单的答案。 在
HashMap
hash
方法的描述中说:

此函数可确保
hashCode
s中只有 每个位位置的常量倍数有一个有界值 碰撞数(默认负载系数下约为8)

但他们是如何做到这一点的?该方法显示确定性行为-如果将相同的
hashCode
作为参数传递,则得到相同的结果。因此,如果您将超过8个对象作为贴图的关键点传递(并且如果您没有重叠负载因子),它们将被放在同一个bucket中。那么,该方法如何保证有限的碰撞次数呢

为了测试我是否正确,我使用了这个。假设我们想要一个32大小的地图,负载系数为0.75。您可以将23个对象放入地图中,但它不会调整大小

Map testMap = new HashMap<SimpleHashCodeObject, String>(32);
最后,您将填充所有内容:

public static void main(String[] args) {
    // TODO Auto-generated method stub
    Map testMap = new HashMap<SimpleHashCodeObject, String>(32);


    for(int i = 1; i <= 12; i++){
        SimpleHashCodeObject sho = new SimpleHashCodeObject();
        sho.setName("a");
        testMap.put(sho, new Integer(i).toString());
    }

    for(int i = 13; i <= 23; i++){
        SimpleHashCodeObject sho2 = new SimpleHashCodeObject();
        sho2.setName("b");
        testMap.put(sho2, new Integer(i).toString());
    }
}
publicstaticvoidmain(字符串[]args){
//TODO自动生成的方法存根
Map testMap=newhashmap(32);

对于(int i=1;i“在每个位位置仅以常量倍数不同的哈希代码”,您的“示例”类具有相同的哈希代码。这是一个糟糕的哈希代码实现的示例!真正留在“在每个位位置仅以常量倍数不同的哈希代码”后面的是什么-假设hash1==2,hash2==8左右?顺便说一句-不同的hashcode-自动转到不同的bucket-不需要任何额外的处理。因此hash方法看起来仍然可疑。“每个位位置只有常量倍数不同的hashcode”您的“示例”类具有相同的哈希代码。这是一个糟糕的哈希代码实现的示例!我们真正留下的是“每个位位置上只有常量倍数不同的哈希代码”-假设hash1==2,hash2==8左右?顺便说一句-不同的hashcode-自动转到不同的bucket-不需要任何额外的处理。因此hash方法看起来仍然可疑。
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Map testMap = new HashMap<SimpleHashCodeObject, String>(32);


    for(int i = 1; i <= 12; i++){
        SimpleHashCodeObject sho = new SimpleHashCodeObject();
        sho.setName("a");
        testMap.put(sho, new Integer(i).toString());
    }

    for(int i = 13; i <= 23; i++){
        SimpleHashCodeObject sho2 = new SimpleHashCodeObject();
        sho2.setName("b");
        testMap.put(sho2, new Integer(i).toString());
    }
}