我问专家,所以不需要简单的答案。
在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个以上的元素。
为什么会这样?你能澄清一下情况吗?