哈希映射中的旧值是否被新值覆盖?

时间:2011-07-26 08:31:30

标签: java hashmap

我有一个哈希映射。我在其中存储了12个不同的键值对。

前8个值存储得很好,但是当我尝试输入第9个值时,它会覆盖旧值。但是规模增加了。

如果我尝试获取旧值,我会得到null s。我还检查了哈希映射表。只有8个值。旧值被覆盖。 这里只有7个值,但大小为9。怎么可能? 我可能做错了什么?enter image description here

2 个答案:

答案 0 :(得分:6)

确保使用不同的密钥。如果是这种情况,请确保密钥类的equals和hashcode按要求工作,即当两个对象相等时,它们的哈希码必须相同。当然,对于不同的键值(或者您期望的不同键)的等于必须返回false。

如果这没有帮助,请发布一个演示您问题的最小但完整(可编译)的示例。

答案 1 :(得分:4)

对于size = 9但表中只有7个值,您误解了HashMap的内部工作原理。所有值都不存储在顶级表中。该表更像是“存储桶”,用于存储按特定哈希码范围分组的条目。每个“桶”都包含一系列链接的条目,因此您在表中看到的只是每个特定范围链中的第一个条目。 size总是正确的,就地图中的条目总数而言。

对于覆盖彼此的条目,只有当您将具有相同键(hashCode和equals)的条目放入现有条目时才会发生这种情况。因此,您要么添加现有密钥,要么添加null作为密钥(null允许为密钥,但您只能有一个密钥为null的条目。)

检查您的代码,是否添加了null个密钥?如果您使用自定义类的实例(您自己创建的实例)作为键,您是否已根据规范实施hashCode()equals()(请参阅http://download.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29)?您是否确保在所有12次放置操作中确实使用了唯一键?