一、接口Iterator中只有三个方法,hasNext()用来判断迭代器中是否还有元素,next()返回迭代器中的下一个元素,最需要注意的是remove()方法,JDK的注释看的头晕,所以去网上找了一篇转载过来,先附上源码吧:
package java.util;
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
现在说一下remove():(转载)
jdk5.0以上的for-each也是利用内部的iterator来遍历集合的(跟以前的iterator一样)获得的Iterator是一个内部类产生的迭代器,这个迭代器在调用next方法时,会检查列表是否被修改过,如果被修改过,就会抛出ConcurrentModificationException异常。进一步说,当使用 fail-fast iterator 对Collection 或 Map 进行迭代操作过程中尝试直接修改Collection / Map 的内容时,即使是在单线程下运行,java.util.ConcurrentModificationException 异常也将被抛出。Iterator 是工作在一个独立的线程中,并且拥有一个 mutex 锁。Iterator 被创建之后会建立一个指向原来对象的单链索引表,当原来的对象数量发生变化时,这个索引表的内容不会同步改变,所以当索引指针往后移动的时候就找不到要迭代的对象,所以按照 fail-fast 原则 Iterator 会马上抛出 java.util.ConcurrentModificationException 异常。 所以Iterator 在工作的时候是不允许被迭代的对象被改变的。但你可以使用Iterator 本身的方法 remove() 来删除对象,Iterator.remove() 方法会在删除当前迭代对象的同时维护索引的一致性。
有意思的是如果你的 Collection / Map 对象实际只有一个元素的时候, ConcurrentModificationException 异常并不会被抛出。这也就是为什么在 javadoc 里面指出: it would be wrong to write a program that depended on this exception for its correctness: ConcurrentModificationException should be used only to detect bugs.
解决方法:在Map或者Collection的时候,不要用它们的API直接修改集合的内容,如果要修改可以用Iterator的remove()方法
由于for-each的写法,使我们无法获得iterator对象,所以这种遍历方式不能进行删除操作。只好改成了比较土的方法实现了,如下:
for (Iterator it = desk.getPkers().iterator(); it.hasNext();) {
PKer pkerOnDesk =(PKer) it.next();
it.remove();
}
二、ListIterator继承了Iterator,扩展了很多功能,是一个比Iterator强大的多的迭代器,先附上源码:
package java.util;
public interface ListIterator<E> extends Iterator<E> {
boolean hasNext();
E next();
boolean hasPrevious();
E previous();
int nextIndex();
int previousIndex();
void remove();
void set(E e);
void add(E e);
}
ListIterator中出了最普通的向后迭代之外,添加了向前迭代的功能。还有额外添加的四个方法:nextIndex()和previousIndex()是返回下一个或上一个元素的索引位置;set(E e):从列表中将next()或previous()返回的最后一个元素返回的最后一个元素更改为指定元素e;add(E e): 将指定的元素插入列表,插入位置为迭代器当前位置之前。
三、Iterable:
一目了然,不做过多描述:
package java.lang;
import java.util.Iterator;
/** Implementing this interface allows an object to be the target of
* the "foreach" statement.
* @since 1.5
*/
public interface Iterable<T> {
/**
* Returns an iterator over a set of elements of type T.
*
* @return an Iterator.
*/
Iterator<T> iterator();
}