通过查看Sun的LinkedHashMap源代码,我发现有一个称为KeyIterator的私有类,我想使用它。如何获得访问权限?
通过查看Sun的LinkedHashMap源代码,我发现有一个称为KeyIterator的私有类,我想使用它。如何获得访问权限?
myMap.keySet().iterator();
你甚至不需要知道它的存在,它只是实现的产物。就像你所知道的,他们可能使用飞猴来迭代键;只要按照规范迭代,他们如何做并不重要。
顺便说一下,你知道 HashMap
有一个名为 KeyIterator
的私有类(ConcurrentHashMap
、ConcurrentSkipListMap
、EnumMap
、IdentityHashMap
、TreeMap
和 WeakHashMap
也有)吗?
这会影响你如何迭代 HashMap
的键吗?
编辑:针对您的评论,注意如果您想要迭代遍历键值对,有一种比遍历键并逐个调用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()