Map<String,Player> players = new HashMap<String,Player>();
这可以将玩家名称等字符串映射到玩家本身.
我的问题是当密钥的Hashcode更改时,查找会发生什么.
这个我期望的不是哈希图的一个主要的问题,因为我不会指望,也不希望改变关键.在前面的例子中,如果玩家名字改变,他不再是那个玩家.然而,我可以使用关键更改的其他字段来查找一个播放器,而不是名称和将来的查找将会起作用.
然而,在Hashset中,由于整个对象的哈希码用于放置项目,如果有人稍微更改对象,则该对象的未来查找将不再解析为Hashtable中的相同位置,因为它依赖于整个对象Hashcode.这是否意味着一旦数据在Hashset中,就不应该改变.还是需要重新打?还是自动完成?到底是怎么回事?
解决方法
可以肯定的是,如果HashMap或TreeMap的密钥以影响其各自的hashcode()/ equals(Object)或compare(…)或compareTo(…)合同的方式进行突变,则数据结构将“打破”.
Does this mean that once data is in a Hashset it shouldnt be changed.
是.
Or does it need to be rehashed? or is it done automatically etc?
它不会被自动重新打开. HashMap不会注意到键的哈希码已经改变了.实际上,当HashMap调整大小时,你甚至不会重新计算hashcode.数据结构记住原始的哈希码值,以避免在散列表调整大小时重新计算所有的哈希码.
如果您知道密钥的哈希码将要更改,则在更改密钥之前,您需要从表中删除该条目,然后将其重新添加. (如果您尝试在突变密钥后删除/放置,则删除将无法找到该条目.)
What is going on?
发生的是您违反了HashMap javadocs中明确规定的合同.不要这样做