Iterator的作用:
Iterator用于遍历集合中的元素,适用于不知道集合内部结构的情况。用户不再与集合类交互,而是与Iterator交互,其清楚知道集合类的内部状态,通过控制iterator达到遍历集合的目的。
Java API中Iterator接口
public Interface Iterator<E>{
boolean hasNext();
Object next();
void remove();
}
其中:
hasnext()是判断语句,表示集合中元素是否遍历完
next()相当于指针,返回Object对象,需要强转为需要的类型
remove()删除集合中元素,不常用。
注意:next()是从前往后遍历,若想向前遍历,可以使用继承Iterator接口的ListIterator接口,其含有E previous()方法,可以向前遍历集合元素。但要注意只有List可以使用ListIterator接口(链表迭代器),只有其含有ListIterator()方便,返回ListIterator对象。
迭代器原理实现:
public class YuanLiIterator1 {
private String[] elem=new String[5];
private int size=0;
/**
* MyIter为实现了Iterator接口的一个内部类
* @author asus1
*
*/
private class MyIter implements Iterator{
//计数器-->指针 游标
private int coursor=-1;
//判断是否存在下一个
public boolean hasNext(){
return coursor+1<size;
}
//获取下一个
public String next(){
coursor++;
return elem[coursor];
}
//删除下一个
public void remove(){
//移动数组
System.arraycopy(elem, coursor+1, elem, coursor, size-(coursor+1));
size=size-1;
coursor--;
}
}
public Iterator iterator(){
return new MyIter();
}
//将MyIter类放入方法中,形成一个方法内部类
public Iterator iterator1(){//方法内部类
class MyIter implements Iterator{
private int coursor=-1;
public boolean hasNext(){
return coursor+1<size;
}
public String next(){
coursor++;
return elem[coursor];
}
public void remove(){
System.arraycopy(elem, coursor+1, elem, coursor, size-(coursor+1));
size=size-1;
coursor--;
}
}
return new MyIter();
}
/**
* 直接返回一个匿名内部类
* @return
*/
public Iterator iterator2(){
//返回Iterator迭代器接口实现类的对象,匿名内部类
return new Iterator(){
private int coursor=-1;
public boolean hasNext(){
return coursor+1<size;
}
public String next(){
coursor++;
return elem[coursor];
}
public void remove(){
System.arraycopy(elem, coursor+1, elem, coursor, size-(coursor+1));
size=size-1;
coursor--;
}
};
}
public static void main(String[] args){
YuanLiIterator1 list=new YuanLiIterator1();
Iterator it=list.iterator2();
while(it.hasNext()){
System.out.println(it.next());
}
System.out.println("-----------------------------");
it=list.iterator2();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
上面的源码中一共存在三种Iterator的实现方式,但Iterator的具体方法实现都一样:
- 通过内部类MyIter实现Iterator,方法iterator()返回一个MyIter对象;
- 通过方法内部类实现的,方法iterator1()中有方法内部类MyIter,该方法返回一个MyIter对象;
- 通过匿名内部类实现的,方法Iterator2()直接返回了一个匿名内部类