如何获取LinkedHashMap的keyIterator?

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

你通过电话得到它

myMap.keySet().iterator(); 

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

那么,您是否知道HashMap有一个名为KeyIterator的私有类( ConcurrentHashMapConcurrentSkipListMapEnumMapIdentityHashMapTreeMapWeakHashMap )?
这会对你如何迭代HashMap的键有所不同吗?


编辑:在响应您的评论时,请注意,如果您尝试迭代Map所有键值对 ,则有一种更好的方法,即迭代键并为每个键调用getentrySet()方法获取一Set所有键值对,然后您可以迭代它们。 所以不要写:

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

你应该写:

 for (Map.Entry entry : myMap.entrySet()) { doSomethingWithKey(entry.getKey()); doSomethingWithValue(entry.getValue()); ... } 

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

请注意,由于keySetentrySetvalues是在Map接口中定义的,因此它们适用于任何Map ,而不仅仅是LinkedHashMap

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

您应该编写API代码并执行类似的操作

 myMap.keySet().iterator() 

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

  private class KeyIterator extends LinkedHashIterator { 

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

 myMap.keySet().iterator()