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()
)
答案 0 :(得分:9)
地图的哈希码被定义为每个哈希码的总和 在地图的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。
返回此映射条目的哈希码值。映射条目
e
的哈希码定义为:(e.getKey()==null ? 0 : e.getKey().hashCode()) ^ (e.getValue()==null ? 0 : e.getValue().hashCode())
这可确保
e1.equals(e2)
暗示任何两个e1.hashCode()==e2.hashCode()
根据{{1}}的一般合同要求,参赛作品e1
和e2
。
你的新地图还没有任何条目,因此总和是0.一切都应该是。
如果您想要返回未覆盖的Object.hashCode
之类的号码,请使用Object.hashCode()
。这是每个地图的(或多或少唯一)数字,当地图内容发生变化时,这个数字不会改变。