在Java集合中,我们通常都通过 “Iterator(迭代器)” 或 “Enumeration(枚举类)” 去遍历集合。
* Iterator支持fail-fast机制,而Enumeration不支持。*
官方说了
Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口而不是 Enumeration 接口。
其实,Iterator是一个很简单的接口,它定义了迭代器应有的基本方法
package java.util;
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
但实际应用就不得了了。
以TreeMap内部的迭代器为例:
其首先是定义了一个基础迭代器,提供
/**
* Base class for TreeMap Iterators
*/
abstract class PrivateEntryIterator<T> implements Iterator<T> {
之后,定义了四个不同迭代器,分别提供键值对,键集,值集,降序集的迭代器,
仅仅是简单地在next()方法上做文章,一个是返回不同类型,一个是内部遍历时采用不同的顺序。
final class EntryIterator extends PrivateEntryIterator<Map.Entry<K,V>> {
EntryIterator(TreeMapEntry<K,V> first) {
super(first);
}
public Map.Entry<K,V> next() {
return nextEntry();
}
}
final class ValueIterator extends PrivateEntryIterator<V> {
ValueIterator(TreeMapEntry<K,V> first) {
super(first);
}
public V next() {
return nextEntry().value;
}
}
final class KeyIterator extends PrivateEntryIterator<K> {
KeyIterator(TreeMapEntry<K,V> first) {
super(first);
}
public K next() {
return nextEntry().key;
}
}
final class DescendingKeyIterator extends PrivateEntryIterator<K> {
DescendingKeyIterator(TreeMapEntry<K,V> first) {
super(first);
}
public K next() {
return prevEntry().key;
}
public void remove() {
if (lastReturned == null)
throw new IllegalStateException();
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
deleteEntry(lastReturned);
lastReturned = null;
expectedModCount = modCount;
}
}