如何获取LinkedHashMap的keyIterator?

14

通过查看Sun的LinkedHashMap源代码,我发现有一个称为KeyIterator的私有类,我想使用它。如何获得访问权限?

3个回答

46
你可以通过调用来获取它。
myMap.keySet().iterator();

你甚至不需要知道它的存在,它只是实现的产物。就像你所知道的,他们可能使用飞猴来迭代键;只要按照规范迭代,他们如何做并不重要。

顺便说一下,你知道 HashMap 有一个名为 KeyIterator 的私有类(ConcurrentHashMapConcurrentSkipListMapEnumMapIdentityHashMapTreeMapWeakHashMap 也有)吗?
这会影响你如何迭代 HashMap 的键吗?


编辑:针对您的评论,注意如果您想要迭代遍历键值对,有一种比遍历键并逐个调用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()迭代值。

请注意,由于keySetentrySetvaluesMap接口中定义,它们适用于任何Map,而不仅仅是LinkedHashMap


1
我之前没有意识到我可以迭代遍历LinkedHashMap,直到我看到了它的内部私有类。不过还是谢谢你的回答。 - Bobby
我不知道entrySet()有什么用。但是,在我使用HashMap的几乎所有地方,它真的非常有用。谢谢@Michael。 - sravanreddy001

4

这是一个私有类,所以你不能直接使用它。

  private class KeyIterator extends LinkedHashIterator<K> {

当您使用普通迭代器时,将返回它的实例。
myMap.keySet().iterator()

3

不应使用作为LinkedHashMap内部实现的一部分定义的任何东西(即在源代码中定义但未在API中定义)。如果内部实现在下一个版本中发生更改会怎么样?所有使用它的代码都将中断。

您应该针对API编写代码,像这样进行处理

myMap.keySet().iterator()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接