Iterator
- Iterator专门为遍历集合而生,集合并没有提供专门的遍历的方法
- Iterator实现迭代器设计模式(设计模式23个:工厂模式、单例模式、迭代器模式)
- iterator.remove() 删除当前遍历到的值
foreach不能删除会出现ConcurrentModificationException - 哪些集合可以使用Iterator遍历
Collection:可以
List:可以
Set:可以
Map:不可以,map并没有实现Iterator接口
提供iterator()方法的就可以将元素交给Iterator;
实现Iterable接口的集合类都可以使用迭代器遍历 - 增强的for循环和Iterator的联系
增强的for循环(遍历集合)时,底层使用的是Iterator
凡是可以使用增强的for循环(遍历的集合),肯定也可以使用Iterator进行遍历 - 增强的for循环和Iterator的区别
1). for-each还能遍历数组,Iterator只能遍历集合
2). 使用for-each遍历集合时不能删除元素,使用Iterator遍历合时能删除元素
源码
hasNext,cursor与size比较是否遍历超出elementData 范围
next ,两个cursor一个指向前一个,一个指向当前???
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor=0; // 当前位置
int lastRet = -1; // 前一个位置
Itr() {}
public boolean hasNext() {
return cursor != size;//cursor是否指向当前数组的最后一个元素的下一个元素,从0开始
}
@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];
}
}
ListIterator
- Iterator可以应用于更多的集合,Set、List和这些集合的子类型。而ListIterator只 能用于List及其子类型。
- 遍历顺序不同
Iterator只能顺序向后遍历next()
ListIterator还可以逆序向前遍历next() previous()
ListIterator<Integer> iterator=list.listIterator();
//向前变量
while (iterator.hasPrevious()){//当前遍历的集合是否还有元素
System.out.println(iterator.previous());//next返回iterator指针当前元素的值
}
- Iterator可以在遍历的过程中remove()
ListIterator可以在遍历的过程中remove()、add()、set()
//向后遍历
while (iterator.hasNext()){//当前遍历的集合是否还有元素
int e=iterator.next();
iterator.remove();
System.out.println(iterator.nextIndex());//next返回iterator指针当前元素的值
}
- ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。