提问者:小点点

具有两个具有相同值但不同桶索引的关键对象的Hashmap


如果Hashmap有两个具有相同值的键,例如:

HashMap map=new HashMap();
map.put("a","abc");
map.put("a","xyz");   

所以这里放两个值为“a”的键,假设第一个桶索引=1,第二个桶索引=9

所以我的问题是,如果桶索引这两个是来不同后应用散列算法,在这如何处理不插入重复的键,因为它是已经存在和hashmap不能有重复的键.请建议你的观点在这。


共3个答案

匿名用户

不会有“第二桶指数”这种东西。

我建议您添加类似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将只产生一个条目,第二个条目只是覆盖条目的值。