通过查看Sun的LinkedHashMaps的源代码,我发现有一个名为KeyIterator的私有类,我想使用它。我怎样才能获得访问权?
答案 0 :(得分:43)
你可以通过调用
来获得它myMap.keySet().iterator();
你甚至不需要知道它存在;它只是实现的一个工件。如你所知,他们可能正在使用飞猴来重复密钥;只要它们按照规范进行迭代,它们如何做就没有关系。
顺便说一下,您是否知道HashMap
有一个名为KeyIterator
的私人课程(ConcurrentHashMap
,ConcurrentSkipListMap
,EnumMap
,{{1} },IdentityHashMap
和TreeMap
)?
这会对你如何迭代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());
...
}
,keySet
和entrySet
定义在Map
interface,因此它们适用于任何values
,而不仅仅是{{1} }}
答案 1 :(得分:3)
您不应该使用任何被定义为LinkedHashMap内部实现的一部分(即在源代码中但未在API中定义)。如果内部实现在下一个版本中发生变化会发生什么?您使用它的所有代码都将中断。
您应该编码API并执行类似
的操作myMap.keySet().iterator()
答案 2 :(得分:3)
这是一个私人课程,所以你不能直接使用它。
private class KeyIterator extends LinkedHashIterator<K> {
使用普通迭代器时会返回它的实例。
myMap.keySet().iterator()