【发布时间】:2010-11-01 23:13:48
【问题描述】:
通过查看 Sun 的 LinkedHashMaps 的源代码,我看到有一个名为 KeyIterator 的私有类,我想使用它。我怎样才能获得访问权限?
【问题讨论】:
标签: java iterator linkedhashmap
通过查看 Sun 的 LinkedHashMaps 的源代码,我看到有一个名为 KeyIterator 的私有类,我想使用它。我怎样才能获得访问权限?
【问题讨论】:
标签: java iterator linkedhashmap
你可以通过调用得到它
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<Key, Value> entry : myMap.entrySet()) {
doSomethingWithKey(entry.getKey());
doSomethingWithValue(entry.getValue());
...
}
如果需要,您还可以使用 values() 迭代这些值。
请注意,由于 keySet、entrySet 和 values 是在 Map interface 中定义的,它们将适用于任何 Map,而不仅仅是 LinkedHashMap。
【讨论】:
是私有类,不能直接使用。
private class KeyIterator extends LinkedHashIterator<K> {
当你使用普通的迭代器时会返回它的一个实例。
myMap.keySet().iterator()
【讨论】:
您不应使用任何定义为 LinkedHashMap 内部实现的一部分(即在源代码中但未在 API 中定义)。如果在下一个版本中内部实现发生变化会发生什么?您使用它的所有代码都会中断。
您应该向API 编码并执行类似的操作
myMap.keySet().iterator()
【讨论】: