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