java - 关于我的基于联系人的应用程序的 Java 碰撞处理的说明

标签 java

我正在使用 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。

与任何与集合相关的问题一样,如果您打算使用自己的类,重要的事情是正确实现 equalshashcode方法(阅读 this )。

关于编辑中的问题:

这是 HashMap 的一个特性,即具有给定键的第一个值会被新值删除。因此,当您添加“新墨西哥”时,“墨西哥”将从 HashMap 中删除。

如果您希望给定键有多个值,请使用 MultiMap(或者简单地使用 HashMap<Integer, List<String>>,但 put 操作有点乏味)。

关于java - 关于我的基于联系人的应用程序的 Java 碰撞处理的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12251337/

相关文章:

java - Android 简单计算器

java - 过多的触摸事件会降低 Android 应用程序的速度

Java:异常

java - Spring ReflectionTestUtils 不设置原始数据类型字段

Java:如何高效存储稀疏数据

java - 为 createWritableChild 切割图像 IllegalArgumentException

java - 如何在基于 JAVA 的 spring config 中配置 Hibernate Db 连接设置

java - 如何证明在项目中使用脚本语言是合理的

java - 使用哈希 URL 在页面加载时打开弹出窗口

java - 如何检测 Java 8 直接内存剩余量?