【问题标题】:How do I get a keyIterator for a LinkedHashMap?如何获取 LinkedHashMap 的 keyIterator?
【发布时间】:2010-11-01 23:13:48
【问题描述】:

通过查看 Sun 的 LinkedHashMaps 的源代码,我看到有一个名为 KeyIterator 的私有类,我想使用它。我怎样才能获得访问权限?

【问题讨论】:

    标签: java iterator linkedhashmap


    【解决方案1】:

    你可以通过调用得到它

    myMap.keySet().iterator();
    

    您甚至不需要知道它的存在;它只是实现的一个工件。如您所知,他们可能正在使用飞猴来迭代键;只要他们按照规范进行迭代,他们怎么做都没有关系。

    顺便说一句,你知道HashMap 有一个名为KeyIterator 的私有类(ConcurrentHashMapConcurrentSkipListMapEnumMapIdentityHashMapTreeMapWeakHashMap 也是如此) ?
    这对您遍历 HashMap 的键的方式有影响吗?


    编辑:针对您的评论,请注意,如果您尝试遍历 Map 中的所有 键值对,有更好的方法比遍历键并为每个键调用 get 的方式。 entrySet() 方法获取所有键值对的 Set,然后您可以对其进行迭代。所以不要写:

    for (Key key : myMap.keySet()) {
        Value val = myMap.get(key);
        ...
    }
    

    你应该写:

    for (Map.Entry<Key, Value> entry : myMap.entrySet()) {
        doSomethingWithKey(entry.getKey());
        doSomethingWithValue(entry.getValue());
        ...
    }
    

    如果需要,您还可以使用 values() 迭代这些值。

    请注意,由于 keySetentrySetvalues 是在 Map interface 中定义的,它们将适用于任何 Map,而不仅仅是 LinkedHashMap

    【讨论】:

    • 在看到内部私有类之前,我没有想到我可以遍历 LinkedHashMap。不过感谢您的回答。
    • 不知道entrySet()有什么用。但是,它在我使用 HashMap 的几乎所有地方都非常有用。谢谢@Michael
    【解决方案2】:

    是私有类,不能直接使用。

      private class KeyIterator extends LinkedHashIterator<K> {
    

    当你使用普通的迭代器时会返回它的一个实例。

    myMap.keySet().iterator()
    

    【讨论】:

      【解决方案3】:

      您不应使用任何定义为 LinkedHashMap 内部实现的一部分(即在源代码中但未在 API 中定义)。如果在下一个版本中内部实现发生变化会发生什么?您使用它的所有代码都会中断。

      您应该向API 编码并执行类似的操作

      myMap.keySet().iterator()
      

      【讨论】:

        猜你喜欢
        • 2021-12-29
        • 2015-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多