Iterator(迭代器,接口)
iterator是一个接口,我们无法创建它,集合里面都实现了iterator接口,内部类
private class Itr implements Iterator<E> { }
并提供了public获取对象的方法
public Iterator<E> iterator() { return new Itr(); }
获取方法:
Iterator it = 集合对象.iterator();
成员方法:
boolean hasNext() 是否有下一个
E next() 获取下一个元素
并发修改异常(ConcurrentModificationException)产生原因:
用迭代器遍历时,使用集合中的方法修改了集合的长度
源码解析:
在next()方法中有一个计数器,每次调用该方法时,都会比较一下看看有没有被修改,如果修改了则报错。
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];
}
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
解决方案:
1.在迭代的过程中,不对集合的长度进行修改
2.使用Iterator提供的方法来操作集合。
扩展:
Iterator接口有一个子接口ListIterator接口(只有List接口下边的集合可以使用)
ListIterator接口中定义了add方法和remove方法,可以对集合添加/删除元素
如果使用ListIterator接口中的add/remove方法对集合添加/删除元素,那么迭代器自己添加/删除的,就不会抛出异常了
使用:
ArrayList<String> array = new ArrayList<String>();
array.add("zhangs");
array.add("lisi");
array.add("zhaol");
Iterator<String> it = array.iterator();
while(it.hasNext()){
String str = it.next();
System.out.println(str);
}