【问题标题】:java hashMap<Integer,String> collisionjava hashMap<Integer,String> 冲突
【发布时间】:2014-04-23 12:17:24
【问题描述】:

如果这个问题已经被问到,我很抱歉,但我不能很好地回答我的问题。 我正在研究 HashMap 我输入了两个值 (7,"value test 1") (7,"value test 2) 根据规范 java API HashMap put,第一个值被第二个替换。

我的问题是什么时候解决冲突?为什么我的第二个值没有存储在 linkedList 中或存储在 hashMap 的另一个位置?是由于equals或hascode方法吗?

最好的问候

【问题讨论】:

标签: java hashmap hash-collision


【解决方案1】:

这与哈希冲突无关。 HashMap 可以正确处理哈希冲突(即具有相同hashcode() 的键)。在您的示例中,两个键相等(即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));

你希望最后一行会发生什么?

也许您正在寻找多地图?

【讨论】:

  • 这就是我要找的结构!!也许是一个愚蠢的问题,大声笑..我预计在这个索引上调用 get 方法会返回一个对象 LinkedList 或类似的东西......为什么 Java 开发人员选择了这个实现?
  • 因为这就是地图的作用。它将一个整数映射到一个字符串(在这种情况下)。参照。 en.wikipedia.org/wiki/Map_%28mathematics%29en.wikipedia.org/wiki/Map_%28computer_science%29。不过,为什么 JDK 不提供 MultiMap 也是一个很好的问题。
【解决方案2】:

如果两个 不同 键解析到哈希图中的 same 桶,则会发生冲突处理。在这种情况下,第二个条目将被放入链表中。

在您的情况下,您替换了 same 键 (7) 的条目,因此没有冲突。

如果您需要一个每个键包含多个值的映射,请使用 Map&lt;key, Set&lt;value&gt;&gt;(您也可以使用 List 等而不是 Set)并自己处理对该集合的添加/删除或使用 Apache Commons 的 MultiMap 或 Google Guava 的 Multimap,例如HashMultimap.

【讨论】:

  • 我才意识到你在说什么......早上太早了,所以......收回我的 -1 和我的评论。
猜你喜欢
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-23
  • 1970-01-01
  • 2015-02-19
  • 2016-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多