如果Hashmap有两个具有相同值的键,例如:
HashMap map=new HashMap();
map.put("a","abc");
map.put("a","xyz");
所以这里放两个值为“a”的键,假设第一个桶索引=1,第二个桶索引=9
所以我的问题是,如果桶索引这两个是来不同后应用散列算法,在这如何处理不插入重复的键,因为它是已经存在和hashmap不能有重复的键.请建议你的观点在这。
不会有“第二桶指数”这种东西。
我建议您添加类似System. out.println(map.toString())
的内容,以便查看第二个put()对您的地图做了什么。
编辑:
在put(key, value)
方法中,桶索引是作为key
元素值的函数计算的,而不是value
元素值的函数(所以“a”和“a”为桶提供相同的索引)。这个函数应该是确定性的,所以给它输入相同的值(在你的例子中是“a”),相同的hashCode()将出来,然后是相同的桶索引。
Java如果散列函数返回相同的散列,则通过equals()
方法确定两个对象的相等性。如果发现对象相等,则简单地将旧对象替换为新对象。
相反,如果对象不相等,它们只是被链接在链表(或平衡树)中,并且映射包含两个对象,因为它们是不同的。
所以,回到你的问题:“如果应用散列算法后两者的桶索引不同”——这对于相同的对象是不可能的。平等的对象必须有相同的哈希码。
为了让@Erwin的答案更清晰,这里是来自JDK的HashMap
的源代码
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
深入挖掘你会发现桶索引是根据key
的哈希码计算的。
为了简单明了,将具有不同值的重复键放入同一个HashMap
将只产生一个条目,第二个条目只是覆盖条目的值。