如何获取LinkedHashMap的keyIterator?

时间:2009-06-10 21:18:49

标签: java iterator linkedhashmap

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

3 个答案:

答案 0 :(得分:43)

你可以通过调用

来获得它
myMap.keySet().iterator();

你甚至不需要知道它存在;它只是实现的一个工件。如你所知,他们可能正在使用飞猴来重复密钥;只要它们按照规范进行迭代,它们如何做就没有关系。

顺便说一下,您是否知道HashMap有一个名为KeyIterator的私人课程(ConcurrentHashMapConcurrentSkipListMapEnumMap,{{1} },IdentityHashMapTreeMap)?
这会对你如何迭代WeakHashMap

的密钥产生影响吗?

修改:在回复评论时,请注意,如果您尝试迭代HashMap中的所有键值对,则会有比迭代密钥并为每个密钥调用Map更好的方法。 entrySet()方法获得所有键值对的get,然后您可以迭代。所以不要写:

Set

你应该写:

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

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

请注意,由于for (Map.Entry<Key, Value> entry : myMap.entrySet()) { doSomethingWithKey(entry.getKey()); doSomethingWithValue(entry.getValue()); ... } keySetentrySet定义在Map interface,因此它们适用于任何values,而不仅仅是{{1} }}

答案 1 :(得分:3)

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

您应该编码API并执行类似

的操作
myMap.keySet().iterator()

答案 2 :(得分:3)

这是一个私人课程,所以你不能直接使用它。

  private class KeyIterator extends LinkedHashIterator<K> {

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

myMap.keySet().iterator()