iterator() Iterator Iterable listIterator
关系
以ArrayList类举例
-
iterator() 为Iterable接口的抽象方法,抽象方法要在具体的实现类中得到实现,如ArrayList中的具体代码:
public Iterator<E> iterator() { return new Itr(); }
-
Iterator接口为iterator()方法的返回值,其有两个经典方法
hasNext();E next();
boolean hasNext(); E next();
-
增强for循环的底层也是通过迭代器实现的:
ArrayList类对hasNext(); E next();
的具体实现,仅截取关键部分
public class ArrayList<E> {
transient Object[] elementData; // 非私有以简化嵌套类访问
private int size;
private class Itr implements Iterator<E> {
int cursor; // 要返回的下一个元素的索引
int lastRet = -1; // 返回的最后一个元素的索引,如果没有,则为 -1
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size;
}
public E next() {
checkForComodification();
int i = cursor;
Object[] elementData = ArrayList.this.elementData;
cursor = i + 1; // cursor下移
return (E) elementData[lastRet = i]; //将元素输出
}
}
}
-
listIterator 处理迭代器与list不能同时操作问题
ArrayList<String> list = new ArrayList<>(); list.add("aa"); list.add("bb"); list.add("cc"); //解决办法:引入新的迭代器:ListIterator,迭代和添加操作都是靠ListIterator来完成的: ListIterator<String> it = list.listIterator(); while(it.hasNext()){ if("bb".equals(it.next())){ it.add("kk"); } }
if(“bb”.equals(it.next())){
it.add(“kk”);
}
}