【问题标题】:100% Accurate key,value HashMap100% 准确的 key,value HashMap
【发布时间】: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();会创建一个始终准确的键值对映射吗?我不需要做任何额外的事情吗?

标签: java hashmap key-value


【解决方案1】:

标准的 hashmap 将保证唯一的键。哈希码不等同于密钥。这只是一种将可能值集快速减少为具有特定哈希码的对象(在您的情况下为字符串)的方法。

【讨论】:

    【解决方案2】:

    首先,请注意:Java 的 HashMaps 工作。假设哈希函数被正确实现,对于同一个键,你总是会得到相同的值。

    现在,在哈希映射中,键的哈希码决定了值将被放置在哪个桶中(如果您不熟悉该术语,请阅读哈希表)。映射的性能取决于哈希码的分布情况,以及每个桶中值的数量的平衡程度。由于您使用的是String,请放心。 HashMap 将“始终准确”。

    【讨论】:

    • 即使hashCode 的实现不正确(只要它始终如一地 ;-),HashMap 仍然可以作为@987654323 工作@ 是最终的限定符...
    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2018-10-30
    • 1970-01-01
    • 2015-10-12
    • 2012-06-30
    • 2019-01-30
    相关资源
    最近更新 更多