在设置我的值时,我遇到了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;
}
答案 0 :(得分:0)
感谢JB Nizet! 问题确实是在存储到地图后引用和修改了密钥。