如果Hashmap具有两个具有相同值的键,例如:
HashMap map=new HashMap();
map.put("a","abc");
map.put("a","xyz");
因此,在此放置两个带有“ a”值的键,并假设第一个bucketindex = 1和 第二个bucketindex = 9
所以我的问题是,之后两者的存储桶索引是否都会不同 应用哈希算法,在此如何处理不插入 重复键,因为它已经存在,并且哈希图不能重复 键。 请提出您对此的看法。
答案 0 :(得分:2)
不会有“第二个桶索引”之类的东西。
我建议您添加类似System.out.println(map.toString())
之类的东西,以查看第二个put()对地图的作用。
编辑:
在方法put(key,value)
中,“存储桶索引”是根据key
元素的值而不是value
元素的值计算的(因此,“ a”和“ a”为存储桶指定相同的索引)。该函数应该是确定性的,因此向其提供相同的值(在您的情况下为“ a”),将出现相同的hashCode(),随后出现相同的存储桶索引。
答案 1 :(得分:1)
在Java中,如果散列函数返回相同的散列,则两个对象的相等性由equals()
方法确定。而且,如果发现对象相等,则将旧对象简单地替换为新对象。
相反,如果对象不相等,它们只会被链接在一个链表(或平衡树)中,并且地图会同时包含两个对象,因为它们不同。
因此,回到您的问题:“如果在应用哈希算法后,两者的存储桶索引都不同”,则对于相等的对象来说这是不可能的。相等的对象必须具有相同的哈希码。
答案 2 :(得分:1)
为使@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
上将只产生一个条目,而第二个则只是覆盖条目的值。
答案 3 :(得分:0)
如果您的问题是如何创建一个可以处理同一个键的多个值的哈希映射,那么您需要的是Map>,以便每次键相同时就向数组列表添加一个新值。