14

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

4

3 回答 3

46

你通过调用得到它

myMap.keySet().iterator();

你甚至不需要知道它的存在;它只是实现的一个工件。如您所知,他们可能正在使用飞猴来迭代键;只要它们根据规范进行迭代,它们如何做并不重要。

顺便说一句,你知道HashMap有一个名为KeyIterator(如ConcurrentHashMap, ConcurrentSkipListMap, EnumMap, IdentityHashMap, TreeMap, and WeakHashMap)的私有类吗?
这对您遍历 a 的键的方式有影响HashMap吗?


编辑:针对您的评论,请注意,如果您尝试遍历 a 中的所有键值对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()

请注意,由于keySetentrySet和是在接口values中定义的,它们将适用于任何,而不仅仅是。MapMapLinkedHashMap

于 2009-06-10T21:20:40.330 回答
4

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

  private class KeyIterator extends LinkedHashIterator<K> {

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

myMap.keySet().iterator()
于 2009-06-10T21:21:30.593 回答
3

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

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

myMap.keySet().iterator()
于 2009-06-10T21:21:24.883 回答