Java ConcurrentHashmap问题

时间:2013-12-21 08:36:35

标签: java hash hashmap

在设置我的值时,我遇到了ConcurrentHashmap的奇怪行为(可能在键上存在一些哈希冲突,但我知道这是由Maps管理好的,因为它们在链表中存储相同的哈希值)。

ShowdownFreqCountVO previousValue = totalCountsShowdown.put(currentKey, new ShowdownFreqCountVO(0, 0));

对于某些特定值,此行将覆盖现有值,而我确定它尚未在地图中

totalCountsShowdown.contains(currentKey)
在put之前调用时,

将返回false。

在“put”指令之后,地图的大小将保持相同,而previousValue将包含先前存储但在不同键下的值。

我对错误的做法有任何想法吗? (注意:在这个阶段,我还没有多线程,所以这不是问题)

非常感谢任何提示! 托马斯

PS:键上的哈希函数(仅包含一个字节值数组)如下:

public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + Arrays.hashCode(values);
    return result;
}

public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    ShowdownFreqKeysVO other = (ShowdownFreqKeysVO) obj;
    if (!Arrays.equals(values, other.values))
        return false;
    return true;
}

1 个答案:

答案 0 :(得分:0)

感谢JB Nizet! 问题确实是在存储到地图后引用和修改了密钥。