我有一个哈希映射。我在其中存储了12个不同的键值对。
前8个值存储得很好,但是当我尝试输入第9个值时,它会覆盖旧值。但是规模增加了。
如果我尝试获取旧值,我会得到null
s。我还检查了哈希映射表。只有8个值。旧值被覆盖。
这里只有7个值,但大小为9。怎么可能?
我可能做错了什么?
答案 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次放置操作中确实使用了唯一键?