Java中的AbstractList迭代器(iterator())方法及示例
在Java中,如果我们想要对List集合进行遍历,那么就需要用到迭代器(iterator)。在Java中,List继承自Collection,而AbstractList是List的一个抽象类。AbstractList提供了很多操作List集合的方法,其中包括了返回迭代器的方法iterator()。
iterator()方法
Iterator<E> iterator()
返回此列表元素的迭代器(按正确序列)。
在实现此方法时,返回的迭代器必须生成所有可一序包含列表中所有元素的连续元素,按正确的顺序。
返回迭代器的方法,就是将列表中的每个元素遍历一遍的基础方法。我们可以通过迭代器的next()方法来依次获取列表中的每个元素。
在使用iterator()方法时,我们需要注意以下几点:
- 如果在遍历的过程中对列表做出了修改(增删改查),那么迭代器就不再有效,调用迭代器相关方法会抛出ConcurrentModificationException异常;
- 迭代器本身是fail-fast机制,即一旦出现并发修改异常,迭代器就立刻会停止遍历,避免数据的不一致性;
- 在使用迭代器遍历时,尽量避免使用List的remove()和List的add()方法,因为这些操作会破坏迭代器的内部状态,从而导致不可预期的错误。
现在,我们通过代码来看看iterator()的具体实现。
iterator()方法示例
import java.util.AbstractList;
import java.util.Iterator;
public class MyList extends AbstractList<Object> {
private Object[] elements;
public MyList(Object[] elements) {
this.elements = elements;
}
@Override
public Object get(int index) {
if (index < 0 || index >= elements.length) {
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + elements.length);
}
return elements[index];
}
@Override
public int size() {
return elements.length;
}
@Override
public Iterator<Object> iterator() {
return new Itr();
}
private class Itr implements Iterator<Object> {
private int cursor;
private int lastRet = -1;
@Override
public boolean hasNext() {
return cursor != size();
}
@Override
public Object next() {
int i = cursor;
if (i >= size()) {
throw new IndexOutOfBoundsException();
}
cursor = i + 1;
return elements[lastRet = i];
}
@Override
public void remove() {
if (lastRet < 0) {
throw new IllegalStateException();
}
try {
MyList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
} catch (IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
}
}
在这个示例中,我们继承了Java的AbstractList类,并重写了其中的get()、size()和iterator()方法。
在iterator()方法中,我们返回了一个Itr类型的迭代器,Itr是我们自己定义的一个迭代器。该迭代器实现了Java提供的Iterator接口,并重写了其中的hasNext()、next()和remove()方法,用于实现迭代器的功能。
在Itr中,我们定义了一个游标cursor和一个lastRet来指向当前的元素。在hasNext()方法中,我们判断游标是否指向了最后一个元素,如果是,就表示遍历完成,否则就表示还可以继续遍历。
在next()方法中,我们通过游标指向的位置来获取数据,并且将游标向后移动一位。在移动之前,我们将当前位置的下标记录在了lastRet中,用于在remove()方法中做校验使用。
在remove()方法中,我们首先对lastRet进行了校验,确保在调用remove()方法之前是已经调用了一次next()方法。然后,我们调用了外部类MyList的remove()方法来实现元素的删除。在删除之后,我们重新设置游标的位置,让它指向被删除元素的下一个位置,并将lastRet重置为-1。
这样,我们就可以通过自己定义的迭代器成功地遍历了我们正在使用的List集合。
结论
通过对Java中AbstractList迭代器(iterator())方法及示例的讲解,我们可以得出以下结论:
- iterator()方法是返回一个List集合的迭代器,用于遍历该集合中的元素;
- iterator()方法获得的迭代器可以使用next()方法来依次获取列表中的每个元素;
- 获取到的迭代器不能同时进行修改操作,否则会抛出ConcurrentModificationException异常;
- 在使用迭代器遍历时,尽量避免使用List的remove()和List的add()方法,因为这些操作会破坏迭代器的内部状态,从而导致不可预期的错误;
- 我们可以通过自定义迭代器来实现对List的遍历。
掌握了Java中List集合的迭代器使用方法,我们就可以更加方便地遍历List集合,从而更高效地完成我们的编程任务。