我正在使用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));
}
答案 0 :(得分:3)
我不完全确定我理解你的问题。
在标准HashMap中,如果您使用相同的密钥放置另一个值,则会替换第一个值。
但是你可以使用例如MultiMap(来自Apache commons)来为每个密钥存储多个值。
如果您的问题与多个具有相同索引的密钥相关,则由实现处理:密钥存储在链接列表中(每个存储桶一个)和实际比较(使用equals
)在get和put操作上完成,这样只要equals
返回false就不会发生冲突。
与任何与集合相关的问题一样,如果您打算使用自己的类,重要的是要正确实现equals
和hashcode
方法(阅读this)。< / p>
关于编辑中的问题:
这是HashMap的一个特性,即具有给定键的第一个值被新的擦除。因此,当您添加“新墨西哥”时,“墨西哥”将从HashMap中删除。
如果您想为给定的密钥设置多个值,请使用MultiMap(或简单地使用HashMap<Integer, List<String>>
,但put
操作稍微繁琐一点。)
答案 1 :(得分:2)
这是一个你应该仔细思考的设计。在我看来,你正在使用Map
和原语 - String
当你以这种方式使用它时是一个原语 - 作为一个抽象的不良近似,一个真正的抽象数据可以更好地服务你自己设计的类型。
例如,联系人姓名String
对我来说不是一个好的抽象。电话簿中有多少重复的名字?一旦你的解决方案超出了一个非平凡的规模,你就会发生冲突。
那么Contact
类在哪里?让它将关联电话号码的名称String
和List
封装在一个对象中,并使用编写良好的equals和hashCode。给它一个独特的私人会员;没有那种碰撞。使用该课程的人将立即更好地了解您要完成的任务。
答案 2 :(得分:0)
不,当两个不同的键散列到相同的值时,键被链接,然后在操作期间,系统执行等于实际键以找到正确的条目。
如果你创建了一个简单的类,它只为hashCode()返回1,那么HashMap仍然可以用于规范,它只会执行非常繁琐并转入一个简单的列表。