通过查看 Sun 的 LinkedHashMaps 的源代码,我看到有一个名为 KeyIterator 的私有类,我想使用它。我怎样才能获得访问权限?
3 回答
你通过调用得到它
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()
。
请注意,由于keySet
、entrySet
和是在接口values
中定义的,它们将适用于任何,而不仅仅是。Map
Map
LinkedHashMap
这是一个私有类,所以你不能直接使用它。
private class KeyIterator extends LinkedHashIterator<K> {
当你使用普通的迭代器时,它的一个实例被返回。
myMap.keySet().iterator()
您不应使用任何定义为 LinkedHashMap 内部实现的一部分(即在源代码中但未在 API 中定义)。如果在下一个版本中内部实现发生变化会发生什么?您使用它的所有代码都会中断。
您应该对API进行编码并执行类似的操作
myMap.keySet().iterator()