关于Iterator迭代器的注意事项
耿祥义
主要内容
iterator方法
ConcurrentModificationException异常
for-each遍历集合
for 遍历集合
代码与效果
1.iterator方法
Java集合框架中的Collection接口的方法:
返回当前集合的一个实现Iterator<E>接口的实例,称作当前集合的 迭代器,比如List<String>的实例list,调用iterator返回list的迭代器:
2.ConcurrentModificationException异常
需要注意的是,当在一个线程中 ,一旦iterator返回了某个集合的迭代器:iteraor,并开始使用这个迭代器(迭代器调用了某个方法),系统将禁止本线程或其它线程让集合调用自己的remove和add方法(例如list.remove(0))引起集合的结构发生变化,也禁止对集合进行排序,如果进行这些操作,程序运行时(无编译错误)将触发
java.util.ConcurrentModificationException异常。
必须等到 iterator返回的迭代器被使用完毕,才允许集合 调用自己的remove和add方法或排序集合。
但是,程序允许迭代器iteraor调用自己实现的 Iterator接口的中的remove方法删除当前迭代器的next返回的集合中的元素(Iterator接口没有提供add方法)。
3.for-each
使用for-each遍历一个集合时,禁止当前集合使用remove和add方法引起集合的结构发生变化,也禁止对集合进行排序。其原因是,for-each算法的内部中启用了集合的迭代器(用户知道即可,但用户程序不能显式地看见相应的代码)。例如下列代码无编译错误,但运行时可能将触发ConcurrentModificationException异常
下列代码无编译错误,但运行时可能触发ConcurrentModificationException异常
下列代码无编译错误,但运行时可能将触发ConcurrentModificationException异常
注 但允许替换操作,比如,list.set(0,"你好");
5.for
普通的循环语句,默认不会触发集合的迭代器,因此不影响集合使用remove和add方法。例如,下列代码运行正常。
展开全文
6.实例代码与运行效果
MainClass.java
代码【1】替换为 list.add("Java");或 Collections.sort(list);将触发ConcurrentModificationException,运行效果如图:
代码【2】替换为 list.remove(s);或 Collections.sort(list);将触发ConcurrentModificationException,运行效果略。
耿祥义主要教材源代码暨习题解答下载