2011-07-26 47 views
-2

我有一个哈希映射。我存储了12个不同的键,值对。哈希映射中的旧值被新值覆盖了吗?

前8个值存储正常,但是当我尝试将第9个值覆盖旧值时。但尺寸增加。

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

+4

提供了一些代码... – chzbrgla

+1

请提供一些代码,它会让你的问题变得清晰,并且允许更好的答案 – amit

+0

也许是因为你使用了同样的密钥? – Tobias

回答

4

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

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

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

+0

s ,,,我只用唯一键,,, – Selva

+0

你真的确定,你已经正确地实现了哈希码和等于方法吗?如果是这样,它会正常工作,所以我认为,某处是一个错误,请张贴您的源代码 – dunni

+0

@Selva:如果你在做put()在你的HashMap中有12次,并且之后你在地图中只有9个条目,那么你就没有使用唯一的键值得记住在这个上下文中unique的定义:hashCode()对象和equals() )产生false,或者你至少有4个相等的键,或者你错误地实现了hashCode()和equals()(如果你使用自定义对象作为键)。 – pap

6

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

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

+0

我提到了上面的屏幕截图,请告诉我怎么可能? – Selva