Iterator迭代器
一、 Iterator迭代器概述
Iterator是Collection集合的迭代器即提供对Collection集合的遍历操作,迭代器允许操作者在遍历的过程中同时删除元素。
- 所有的Collection接口的容器类都有一个Iterator方法用以返回一个实现了Iterator接口的对象
- Iterator对象称为迭代器,用以方便的对容器内的元素进行遍历
- Iterator定义了以下方法:
方法名 | 作用 |
---|---|
hasNext | 判断是否有下一个元素 |
next | 返回当前游标右边的元素,并将游标移动到下一个位置 |
remove | 删除游标左边的数据,在执行完next以后,该操作执行一次 |
二、Iterator迭代器使用方法
1.使用迭代器的遍历以及删除的基本方法
public static void main(String[] args) {
List<Father> list = new ArrayList<>();
list.add(new Father("cch", 18));
list.add(new Father("sz", 26));
list.add(new Father("zc", 24));
//通过实现类调用iterator实现方法
Iterator<Father> i = list.iterator();
//使用hasNext方法判断下一个角标是否已到达集合长度的未尾,如果是说明下个角标没有数据了 返回false
while (i.hasNext()) {
//将角标右移到下一位并返回游标右边的元素
Father father = i.next();
//删除对象,必须和next()方法协同使用不然报错
i.remove();
System.err.println(father);
}
}
Iterator迭代器源码解析
以List中的ArrayList为例解析利用Iterator完成遍历、删除的后台逻辑
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
/*
*当调用iterator实现方法后会将private的内部类Itr返回出去,
*接下来的所有hasNext,next,remove方法都是使用Itr类实现后的方法
*/
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
//游标
int cursor;
//记录上一个被操作的角标
int lastRet = -1;
int expectedModCount = modCount;
Itr() {}
//判断如果角标等于了集合的长度,说明没有数据了
public boolean hasNext() {
return cursor != size;
}
/**
*1、获取当前角标的数据
*2、将游标移动到下一个位置
*/
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];
}
public void remove() {
(lastRet < 0)
throw new IllegalStateException();
//处理并发修改
checkForComodification();
try {
//这里就是为什么调用remove方法前必须先进行next,不然未对lastRet进行赋值可能会出现异常
ArrayList.this.remove(lastRet);
//删除后未避免对下次next产生异常,将cursor记录器赋值成被删的元素角标
cursor = lastRet;
//避免多次remove方法产生异常
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
}
}
ListIterator接口
ListIterator是一个相较于Iterator更强大的迭代器,继承于Iterator接口,扩展了很多新的方法,同时也只能对各种List进行访问,操作。
特点
- 可以向前或向后遍历
- 在遍历的时候可对元素进行修改
- ListIterator定义了以下方法:
方法名 | 作用 |
---|---|
hasNext | 判断此列表迭代器在右侧是否还有数据 |
next | 返回列表中右侧的元素并将游标向前推进 |
hasPrevious | 判断此列表迭代器在左侧是否还有数据 |
previous | 返回列表中左侧的元素并将游标向后推进 |
nextIndex | 返回当前游标所在的位置 |
previousIndex | 返回当前游标的前一个位置 |
remove | 删除调用next()或previous()返回的最后一个元素 |
set | 将指定元素替换列表中调用next()或previous()返回的最后一个元素 |
add | 将数据插入到集合中 |