Java集合遍历器---迭代器(Iterator)

一、使用方法

最常用的就是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);
}
}

代码结果展示:
在这里插入图片描述
为什么会出现这个异常呢?为此我查看了源码,发现源码中有两个属性modCountexpectedModCount被专门用来防止在迭代器遍历时,集合应该处于可分析状态。

源码如下
在这里插入图片描述

modCount其实是属于ArrayList的属性,而expectedModCount是属于其私有内部类Itr的属性。modCount负责记录集合内元素个数,在Itr中每次进行相应操作都会先checkForComodification();(源码如上图),expectedModCount只有在内部静态类Itr加载的时候和调用Itr.remove()的时候会发生改变(remove()如下图2),但是,如果在Itr遍历时直接调用集合类中的add和remove就会造成ModCount改变,而expectedModCount未变,就会产生异常。

图1:
在这里插入图片描述
图2:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_51801058/article/details/114277155