无论如何我可以打印出具有碰撞值的键吗?如果一个键有两个值,我希望能够打印出这些值,我该怎么做呢?我在哈希映射类中并对其进行修改。
答案 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()而不存储它们。