为什么hashCode()在将项添加到HashMap之前返回零?

时间:2011-07-07 23:36:51

标签: java

Map map = new HashMap();
System.out.println("hashCode:"+map.hashCode()); //hashcode==0 why?

map.put("test","test");
System.out.println("hashCode:"+map.hashCode()); //hashcode be okay here

如何在Map map = new HashMap();之后获取hashCode? (例如:new Object().hashCode()

2 个答案:

答案 0 :(得分:9)

来自documentation

  

地图的哈希码被定义为每个哈希码的总和   在地图的entrySet()视图中输入。   这确保了m1.equals(m2)   暗示   m1.hashCode()== m2.hashCode()   两个地图m1和m2,根据要求   Object.hashCode()的一般合同。

由于您的HashMap(派生自AbstractMap)最初为空,因此该总和为零。

答案 1 :(得分:2)

地图的hashCode被定义为键和值的所有哈希码的总和。

更准确地说,Map.hashCode()被指定为:

  

返回此地图的哈希码值。地图的哈希码定义为   是地图entrySet()视图中每个条目的哈希码的总和   这可确保m1.equals(m2)暗示m1.hashCode()==m2.hashCode()代表Object.hashCode()   根据{{​​1}}的一般合同的要求,两个地图m1和m2。

Map.Entry.hashCode()定义为

  

返回此映射条目的哈希码值。映射条目e的哈希码定义为:

(e.getKey()==null   ? 0 : e.getKey().hashCode()) ^
(e.getValue()==null ? 0 : e.getValue().hashCode())
     

这可确保e1.equals(e2)暗示任何两个e1.hashCode()==e2.hashCode()   根据{{​​1}}的一般合同要求,参赛作品e1e2

你的新地图还没有任何条目,因此总和是0.一切都应该是。

如果您想要返回未覆盖的Object.hashCode之类的号码,请使用Object.hashCode()。这是每个地图的(或多或少唯一)数字,当地图内容发生变化时,这个数字不会改变。