关于基于联系人的应用程序的Java中的冲突处理的说明

时间:2012-09-03 16:24:41

标签: java

我正在使用java.util.HashMap来关联联系人姓名和与联系人关联的电话号码列表,因此它的类型为String, List<String>。但是,可以有多个键可以映射到与Say key1中相同的桶:&lt; 1234,5678&gt;存储在哈希映射中的索引2中。我可以有另一个可以哈希到同一个索引的key2。那么,key1:&lt; 1234,5678&gt;被key2取代:&lt; 7890,1456&gt; ????或者它是否被链接,key1和key2都将存储在该索引中?

编辑: 我试图理解这一点,下面的代码只返回新墨西哥州。现在在这种情况下,它们都获得相同的哈希码,所以这是一个正确的碰撞?在这种情况下,不应该两个值链接?所以不应该存储看起来像哈希码是2然后在地图中的索引2(OR数组)它应该是1-Mexico,1-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));

    }

3 个答案:

答案 0 :(得分:3)

我不完全确定我理解你的问题。

在标准HashMap中,如果您使用相同的密钥放置另一个值,则会替换第一个值。

但是你可以使用例如MultiMap(来自Apache commons)来为每个密钥存储多个值。

如果您的问题与多个具有相同索引的密钥相关,则由实现处理:密钥存储在链接列表中(每个存储桶一个)和实际比较(使用equals)在get和put操作上完成,这样只要equals返回false就不会发生冲突。

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

关于编辑中的问题:

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

如果您想为给定的密钥设置多个值,请使用MultiMap(或简单地使用HashMap<Integer, List<String>>,但put操作稍微繁琐一点。)

答案 1 :(得分:2)

这是一个你应该仔细思考的设计。在我看来,你正在使用Map和原语 - String当你以这种方式使用它时是一个原语 - 作为一个抽象的不良近似,一个真正的抽象数据可以更好地服务你自己设计的类型。

例如,联系人姓名String对我来说不是一个好的抽象。电话簿中有多少重复的名字?一旦你的解决方案超出了一个非平凡的规模,你就会发生冲突。

那么Contact类在哪里?让它将关联电话号码的名称StringList封装在一个对象中,并使用编写良好的equals和hashCode。给它一个独特的私人会员;没有那种碰撞。使用该课程的人将立即更好地了解您要完成的任务。

答案 2 :(得分:0)

不,当两个不同的键散列到相同的值时,键被链接,然后在操作期间,系统执行等于实际键以找到正确的条目。

如果你创建了一个简单的类,它只为hashCode()返回1,那么HashMap仍然可以用于规范,它只会执行非常繁琐并转入一个简单的列表。