如何获取LinkedHashMap的keyIterator?
通过查看Sun的LinkedHashMaps的源代码,我看到有一个名为KeyIterator的私有类,我想使用它。 我怎样才能获得访问权限?
你通过电话得到它
myMap.keySet().iterator();
你甚至不需要知道它存在; 它只是实现的一个工件。 如你所知,他们可能正在使用飞猴来重复密钥; 只要他们按照规范进行迭代,他们是如何做的并不重要。
那么,您是否知道HashMap
有一个名为KeyIterator
的私有类( ConcurrentHashMap
, ConcurrentSkipListMap
, EnumMap
, IdentityHashMap
, TreeMap
和WeakHashMap
)?
这会对你如何迭代HashMap
的键有所不同吗?
编辑:在响应您的评论时,请注意,如果您尝试迭代Map
所有键值对 ,则有一种更好的方法,即迭代键并为每个键调用get
。 entrySet()
方法获取一Set
所有键值对,然后您可以迭代它们。 所以不要写:
for (Key key : myMap.keySet()) { Value val = myMap.get(key); ... }
你应该写:
for (Map.Entry entry : myMap.entrySet()) { doSomethingWithKey(entry.getKey()); doSomethingWithValue(entry.getValue()); ... }
如果需要,您还可以使用values()
迭代值。
请注意,由于keySet
, entrySet
和values
是在Map
接口中定义的,因此它们适用于任何Map
,而不仅仅是LinkedHashMap
。
您不应该使用任何被定义为LinkedHashMap内部实现的一部分(即在源代码中但未在API中定义)。 如果内部实现在下一个版本中发生变化会发生什么? 您使用它的所有代码都将中断。
您应该编写API代码并执行类似的操作
myMap.keySet().iterator()
这是一个私人课程,所以你不能直接使用它。
private class KeyIterator extends LinkedHashIterator {
使用普通迭代器时会返回它的一个实例。
myMap.keySet().iterator()