一、使用方法
最常用的就是remove()、hasnext()、next()
比较简单,直接贴上代码
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
//Integer[] array= {1,2,3,4};
//比较集合和数组的toString()
//System.out.println(array.toString());
//System.out.println(list.toString());
Iterator<Integer> itr=list.iterator();
//正常遍历
while(itr.hasNext()) {
if(itr.next()==1)itr.remove();//remove是remove最后所遍历的最后一个元素
}
System.out.println(list);//展示移除了1之后的list
结果展示:
二、注意事项
我们在使用Iterator的时候,一定不要通过原集合的引用去改变集合,否则会出现java.util.ConcurrentModificationException
!!!
代码接着上面的代码写:
package foundation.collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class IteratorTest {
public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
//Integer[] array= {1,2,3,4};
//比较集合和数组的toString()
//System.out.println(array.toString());
//System.out.println(list.toString());
Iterator<Integer> itr=list.iterator();
//正常遍历
while(itr.hasNext()) {
if(itr.next()==1)itr.remove();//remove是remove最后所遍历的最后一个元素
}
System.out.println(list);//展示移除了1之后的list
Iterator<Integer> itr1=list.iterator();
while(itr1.hasNext()) {
/*注意:如果直接是if(itr1.next()==3)list.remove(3);3会被当成remove(index),
* 而不是我们所期待的remove(Object)*/
if(itr1.next()==3)list.remove(Integer.valueOf(3));
}
System.out.println(list);
}
}
代码结果展示:
为什么会出现这个异常呢?为此我查看了源码,发现源码中有两个属性modCount
和expectedModCount
被专门用来防止在迭代器遍历时,集合应该处于可分析状态。
源码如下
modCount
其实是属于ArrayList的属性,而expectedModCount
是属于其私有内部类Itr的属性。modCount负责记录集合内元素个数,在Itr中每次进行相应操作都会先checkForComodification();
(源码如上图),expectedModCount只有在内部静态类Itr加载的时候和调用Itr.remove()的时候会发生改变(remove()如下图2),但是,如果在Itr遍历时直接调用集合类中的add和remove就会造成ModCount
改变,而expectedModCount
未变,就会产生异常。
图1:
图2: