迭代器:即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续再判断,如果还有就再取出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。
Iterator<E>接口:
boolean hasNext();//判断是否有下一个元素
E Next();//获取元素
void remove();//删除元素,获取的是谁,删除的就是谁
注意事项:
通过迭代器遍历集合的过程中不能通过集合对象进行增、删操作;但可以使用迭代器的删除方式删除。
原理:1.调用iterator方法,实现类会覆盖重写该方法,不同的实现类覆盖重写的是不一样的。
2.调用iterator方法,返回的是Iterator接口的具体的实现类
ArrayList类的iterator方法:
LinkedList类的iterator方法:
我们仅以ArrayList对迭代器的实现原理为例:
例:
import java.util.ArrayList;
import java.util.Iterator;
public class Test {
public static void main(String[] args) {
ArrayList<String> list=new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
Iterator<String> it=list.iterator();
while(it.hasNext()) {
String str=it.next();
System.out.println(str);
}
}
}
/*
*打印结果为:aa
* bb
* cc
*/
原理:
import java.util.Iterator;
public class ArrayList<E>{
private int size;//记录元素个数
private Object[] elementDate;//集合底层用来保存元素的数组
//Itr这个类是一个成员内部类
private class Itr<E> implements Iterator<E>{
//成员内部类的变量
private int cursor; //默认值是0
//判断是否为最后一个元素
public boolean hasNext(){
return cursor != size;//size是外部类的成员变量
}
//获取各个元素并保存在数组中
public E next(){
return (E)elementData[cursor++];//elementData是外部类的成员变量
}
}
}
图示: