打印出hashmap碰撞

时间:2012-02-09 17:48:15

标签: java hashmap

无论如何我可以打印出具有碰撞值的键吗?如果一个键有两个值,我希望能够打印出这些值,我该怎么做呢?我在哈希映射类中并对其进行修改。

4 个答案:

答案 0 :(得分:3)

  

如果某个键有两个值......

HashMap中,密钥不能包含两个值。如果您使用现有map.put(key,value)来致电key,则会从地图中移除旧值,并由put()返回。

每个密钥具有多个值的一种方法是使用HashMap<K,Collection<V>>。这会自动提供您想要的功能,因为您可以在向其添加新元素后检查值集合的内容。

还有第三方类提供此功能,例如MultiValueMap

修改

如果您正在讨论最终位于同一存储桶中的多个密钥,则需要修改HashMap的{​​{1}}方法:

put()

(在public V put(K key, V value) { if (key == null) return putForNullKey(value); int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); if (table[i] != null) { // TODO: there's already something in this bucket } for (Entry<K,V> e = table[i]; e != null; e = e.next) { ... 行的位置添加代码。)

您需要对TODO和其他相关方法进行类似的更改,例如putForNullKey()

答案 1 :(得分:1)

如果你正在修改HashMap类,那么你应该能够找到从哈希数组中链接元素列表的位置,并检测链中何时存在多个元素。

但是,你最好有一个很好的理由来修改HashMap,你最好更改类的包和名称(比如com.my.company.HashMapWithCollisionStatistics)或者冒着每个人的永恒愤怒的风险谁来支持你在你的小组中维护Java代码。

答案 2 :(得分:0)

只需使用Google集合中的MultiMap。

答案 3 :(得分:0)

为什么你需要这样做?如果只是想检查冲突,那么在你试图存储在hashmap中的对象上调用hashcode()而不存储它们。