2014-04-23 130 views
0

对不起,如果这个问题已经被问到了,但是我不好解答我的问题。 我正在HashMap中我把两个值(7,“值试验1”)(7,“值试验2) 根据规范的Java API HashMap put第一值被第二替换。java hashMap <Integer,String>碰撞

我问题是,当谈到冲突?为什么我的第二个值未在LinkedList的或存储在另一个地方存储在HashMap中的分辨率是多少?这是由于相等于或hascode方法??

问候

+0

如果你想存储多个值同一个键,就可以从Apache的集合使用多重映射。 https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/MultiMap.html – gaganbm

+0

以防万一你不知道,'Map#put'返回在这种情况下,你可以随心所欲地做任何事情。 – A4L

回答

3

这与散列冲突无关。哈希碰撞(即,具有相同hashcode()的密钥)由HashMap正确处理。在你的例子中,两个键都是相等的(即,7.equals(7) == true),所以旧值被替换。

在下面的例子

Map<Integer, String> map = new HashMap<>(); 
map.put(7, "value 1"); 
map.put(7, "value 2"); 
System.out.println(map.get(7)); 

你会在最后一行料到会发生的?

也许您在寻找multimap?

+0

这是我期待的结构!也许一个愚蠢的问题大声笑..我期望在这个索引上获取方法的调用返回一个对象LinkedList或类似的东西......为什么Java开发人员选择了这种实现? – asko

+0

因为这是一个Map的功能。它将一个整数映射到一个字符串(在这种情况下)。参看http://en.wikipedia.org/wiki/Map_%28mathematics%29和http://en.wikipedia.org/wiki/Map_%28computer_science%29。但是,为什么JDK不提供MultiMap也是一个很好的问题。 – Cephalopod

0

冲突处理发生如果两个不同键解析为相同桶中的散列映射。在这种情况下,第二项将被放入链接列表中。

在您的情况下,您替换相同的键(7)的条目,从而没有碰撞。

如果你需要一个地图,其中包含每个键多个值或者使用一个Map<key, Set<value>>(你也可以使用一个List等,而不是一个Set)和处理添加/删除到自己设置或使用Apache的百科全书MultiMap或谷歌番石榴的Multimap,例如HashMultimap

+0

我刚刚意识到你在说什么......早上太早,因此......撤回我的-1和我的评论。 – jgitter

+0

好吧我现在明白了,谢谢你回答 – asko