【发布时间】:2012-06-30 05:30:17
【问题描述】:
根据网页http://www.javamex.com/tutorials/collections/hash_codes_advanced.shtml
哈希码不能唯一标识一个对象。它们只是缩小了匹配项的选择范围,但预计在正常使用中,几个对象很有可能共享相同的哈希码。因此,当在映射或集合中查找键时,必须比较实际键对象的字段以确认匹配。”
首先,这是否意味着在 has 映射中使用的键也可能指向多个值?我认为确实如此。
如果是这样的话。如何创建“始终准确”的哈希图或类似的键、值对象?
我的键需要是字符串,我的值也需要是字符串。我需要大约 4,000 到 10,000 个键值对。
【问题讨论】:
-
带有 String 键的 map 不会有这个问题,因为 String 是常量,所以 "hello" 和 "Hello" 会返回不同的哈希码。你应该对这些案例做更多的研究和测试。
-
@LuiggiMendoza 这有点误导。有很多——也许是“无限的”? -- 比(32 位)哈希码数量更多的不同字符串值。但是,哈希码只是确定对象是否作为键存在于 HashMap 中的 第一步 ...即使存在 冲突,HashMap 仍将起作用只要
equals被正确实现(并且hashCode返回一个一致 值,不管它是什么),就可以正确地实现。我认为张贴者担心太多键导致 HashMap “失败”。 -
@nathan 我认为如果替换:“...必须因此比较...”与“...与equals()...比较”(尽管这改变引用的上下文一些)
-
@pst 我知道,也许我把 nathan 派到了错误的一边。不过,要了解 HashMap 的工作原理,最好阅读 Map Documentation
-
so HashMap
myMap = new HashMap ();会创建一个始终准确的键值对映射吗?我不需要做任何额外的事情吗?