我正在使用 java.util.HashMap 来关联联系人姓名和与该联系人关联的电话号码列表,因此它的类型为 String, List<String>
。然而,可以有多个键可以映射到同一个存储桶,就像假设 key1:<1234,5678> 存储在 HashMap 的索引 2 中一样。我可以有另一个 key2 可以散列到同一索引中。那么,key1:<1234,5678> 会被 key2:<7890,1456> 替换吗???或者它会被链接起来并且 key1 和 key2 都将存储在该索引中吗?
编辑: 我试图理解这一点,下面的代码仅返回新墨西哥州。现在在这种情况下,他们都得到相同的哈希码,所以这是一个冲突,正确吗?在这种情况下,两个值不应该被链接起来吗?那么,存储不应该看起来像散列码是 2 那么在映射(或数组)中的索引 2 处它应该是 1-墨西哥,1-新墨西哥,正确吗?那么返回的值应该是 Mexico 和 New mexico 吗?为什么不被锁在这里?
public static void main(String[] args)
{
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1, "Mexico");
map.put(1, "New Mexico");
System.out.println(map.get(1));
}
最佳答案
我不完全确定我理解你的问题。
在标准中HashMap ,如果您使用相同的键放置另一个值,它将替换第一个值。
但是您可以使用例如 MultiMap (来自 Apache commons)每个键存储多个值。
如果您的问题与多个具有相同索引的键相关,则由实现处理:键 存储在链接列表中(每个存储桶一个)并完成实际比较(使用 equals
)在 get 和 put 操作上,只要 equals
就不会发生冲突返回 false。
与任何与集合相关的问题一样,如果您打算使用自己的类,重要的事情是正确实现 equals
和hashcode
方法(阅读 this )。
关于编辑中的问题:
这是 HashMap 的一个特性,即具有给定键的第一个值会被新值删除。因此,当您添加“新墨西哥”时,“墨西哥”将从 HashMap 中删除。
如果您希望给定键有多个值,请使用 MultiMap(或者简单地使用 HashMap<Integer, List<String>>
,但 put
操作有点乏味)。
关于java - 关于我的基于联系人的应用程序的 Java 碰撞处理的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12251337/