1、Itr是AbstractList里面的一个内部类,实现了Iterator接口。
public Iterator<E> iterator() {
return new Itr();
}
2、分析Itr。
private class Itr implements Iterator<E> {
//下一个元素的索引位置
int cursor = 0;
//lastRet表示上一个元素的索引位置, 如果执行了remove操作会置为-1
int lastRet = -1;
/*来判断遍历过程中集合是否被修改过
modCount用于记录ArrayList集合的修改次数,初始化为0,
每当集合被修改一次,如add、remove等操作,modCount + 1,所以如果modCount不变,则表示集合内容没有被修改
主要是用于实现ArrayList集合的快速失败机制
*/
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size();
}
public E next() {
//判断集合是否被修改
checkForComodification();
try {
int i = cursor;
E next = get(i);
//改变上一个和当前索引位置
lastRet = i;
cursor = i + 1;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
//判断集合是否被修改
checkForComodification();
try {
//调用list的remove操作
AbstractList.this.remove(lastRet);
if (lastRet < cursor)
cursor--;
//将上一个元素的索引位置置为-1
lastRet = -1;
//重新赋值expectedModCount
expectedModCount = modCount;
} catch (IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}
//判断集合是否被修改
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
3、迭代器删除元素错误情况。
(1)错误1
import java.util.Iterator;
import java.util.ArrayList;
public class Test{
public static void main(String srgs[]) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
Iterator iterator = list.iterator();
iterator.remove();
}
}
执行结果:
TIM截图20180413145538.png
原因是:在remove的时候会判断lastRet<0 ,而lastRet 的初始值为-1。
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
...
}
(2)错误2
import java.util.Iterator;
import java.util.ArrayList;
public class Test{
public static void main(String srgs[]) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
Iterator iterator = list.iterator();
iterator.next();
iterator.remove();
iterator.remove();
}
}
执行结果:
TIM截图20180413145538.png
原因:在执行next后lastRet = 0,执行第一个Remove,后 lastRet = -1 。
(3)错误3
import java.util.Iterator;
import java.util.ArrayList;
public class Test{
public static void main(String srgs[]) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
String next = (String)iterator.next();
if(next.equals("a")) {
list.remove("a");
}
}
}
}
执行结果:
TIM截图20180413150527.png
错误原因:
list.remove(obj),操作会导致 modCount + 1, 导致expectedModCount == modCount 不成立。
4、迭代器正确删除元素方法。
import java.util.Iterator;
import java.util.ArrayList;
public class Test{
public static void main(String srgs[]) {
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
String next = (String)iterator.next();
if(next.equals("a")) {
iterator.remove();
}
}
System.out.println("list:" + list);
}
}
执行结果:
TIM截图20180413152035.png