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

时间:2015-10-01 18:45:43

标签: java

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

  

此功能可确保hashCode只有不同之处    每个位位置的常数倍数有界    碰撞次数(默认载荷系数约为8)。

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

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

Map testMap = new HashMap<SimpleHashCodeObject, String>(32);

然后定义一些对象:

public class SimpleHashCodeObject {
    private String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        SimpleHashCodeObject that = (SimpleHashCodeObject) o;
    return false;
    }

    @Override
    public int hashCode() {
        if(name.equals("a")) return 1;
        if (name.equals("b"))  return 2;
        else return 3;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

最后,你填充了一切:

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());
    }
}

在调试窗口中,我可以在此地图中看到2个存储桶,每个存储桶包含8个以上的元素。

enter image description here

为什么会这样?你能澄清一下情况吗?

0 个答案:

没有答案