我需要一个简单的场景来在HashMap中产生散列冲突。有人可以提供一个。
如果我的hashmap键是不可变的,是否可能产生散列冲突?
此致
Raju komaturi
答案 0 :(得分:4)
您可以创建自己的类型并创建错误的哈希函数:
public class BadHash {
private String aString;
public BadHash(String s) {
aString = s;
}
public int hashCode() {
return aString.length();
}
public boolean equals(Object other) {
// boilerplate stuff
BadHash obj = (BadHash) other;
return obj.aString.equals(aString);
}
}
这样可以轻松创建碰撞。
一个例子是:
BadHash a = new BadHash("a", value1);
BadHash b = new BadHash("b", value2);
hashMap.add(a);
hashMap.add(b);
这两个条目会发生冲突,因为a
和b
哈希值相同,即使它们不相等。
答案 1 :(得分:1)
假设您可以更改密钥类的哈希码方法。
public int hashCode() {
return 1; // Or any constant value
}
这将使每一个键发生碰撞。
答案 2 :(得分:0)
不能比这简单得多:
Map<String, Object> map = new HashMap<String, Object>();
map.put("a", null);
map.put("a", null);
答案 3 :(得分:0)
最简单的方法是将HashMap的initialCapacity
设置为较低的值并开始插入元素。
我想你也可以设计一个类,这样两个对象可以返回相同的hashCode
值,即使equals
会返回false。
从我所看到的情况来看,如果发生碰撞,默认的HashMap无法让告诉你。