Iterator常用来遍历实现了Iterable接口的对象,下面以ArrayList作为分析对象来研究其实现原理。
迭代器遍历ArrayList的方法:
Iterator it = list.iterator();
while(it.hasNext()){
String str = it.next();
}
先看看类的继承关系:
==>表示继承类,–>表示实现接口
ArrayList==>AbstractList–>List–>Collection–>Iterable
Iterable的结构如下:
public interface Iterable<T> {
// 该方法返回一个迭代器
Iterator<T> iterator();
// 省略其他方法
}
Iterator的结构如下:
public interface Iterator<E> {
// 判断是否有下一个元素
boolean hasNext();
// 把游标往下移动
E next();
// 省略其他方法
}
遍历过程涉及到的主要代码如下:
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor;// index of next element to return
int lastRet = -1; // index of last element returned;
// -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
分析下遍历过程:
1,通过iterator()方法获取到一个Iterator
2,hasNext()方法判断游标是否越界,当cursor等于list的size时表示游标越界了。cursor表示游标的指向,默认指向第一个(下标为0)元素。
3,next()方法负责把游标往下挪动一个位置,同时返回上一个位置的元素值。