【问题标题】:HashMaps/HashTable explanation [duplicate]HashMaps/HashTable 解释 [重复]
【发布时间】:2013-03-16 22:30:09
【问题描述】:

我已经阅读了很多关于这些的内容,但在一个方面仍然很困惑。 HashMaps 接受 K,V 对。为什么需要这样做?

例如,我想在 HashMap myMap 中添加“abracadabra”。

不就是用String.hashCode()函数作为key,然后用“abracadabra”作为value吗?

然后,如果我试图查找“abracadabra”是否存在,它将检查该 hashCode 的“桶”是否为非空,如果它遍历该“桶”中的所有内容(最坏的情况是 O(n )...但实际上并非如此)。所以我要说的是对象 .hashCode() 函数不是键,对象是哈希码吗?为什么需要声明一个显式的 Key?

K,V 对的目的是什么?我已经多次向我解释了这一点,并阅读了多篇文章/示例/等。我仍然无法通过我厚厚的头骨。

【问题讨论】:

  • 您不能将“abracadabra”添加到您的地图中。您只能添加键 (K) / 值 (V) 对。
  • 你想建立一些其他的数据结构来存储键值对吗?

标签: java hashmap key key-value


【解决方案1】:

hashmap 是从键(在您的情况下为 abracadabra)到对象的映射。如果您从其他地方获取密钥,这很有用,例如标识用户的 id,您需要为该用户加载其他数据。

你描述的更像是HashSet

【讨论】:

    【解决方案2】:

    您正在寻找一个错误的对象:HashMap 不适合存储单个对象(例如字符串“abracadabra”),它们确实适合存储键值对,其中两个部分都很重要 - 一个简单的例子将是一个属性存储:属性名称是键,属性值是值。

    如果您真的只想存储一个对象,请查看其他结构。我想到了 HashSet。

    【讨论】:

    • 那么hashmap基本上是容器的hashset吗? (在你的例子中,持有财产的名称和价值)
    • 不,HashMap 是一个键/值存储,您可以在其中通过键查找值。在内部,键/值对根据键的哈希码存储在不同的列表中。
    【解决方案3】:

    如果我没听错的话,您希望 HashSet 的功能由 HashMap 完成。查看 HashSet 文档,可能就是您要搜索的内容。

    HashMaps 工作方式不同,给你一个提示:你可以用不同的键存储相同的字符串(具有相等的 hashCode):

    String myString = "hallo";
    HashMap<String,String> map = new HashMap<String,String>();
    map.put("key1", myString);
    map.put("key2", myString);
    

    【讨论】:

      【解决方案4】:

      hashCode 本身不足以查找值:不同的键可以具有相同的hashCode。拥有hashCode 的意义仅是为了快速缩小哈希表将包含该键和该值的条目的位置。

      【讨论】:

        猜你喜欢
        • 2015-07-07
        • 1970-01-01
        • 2017-11-03
        • 2018-11-24
        • 1970-01-01
        • 2020-05-11
        • 2013-04-27
        • 1970-01-01
        • 2017-10-21
        相关资源
        最近更新 更多