×

迭代 注意事项 Iterator 老师 关于

耿老师教你学Java:关于Iterator迭代器的注意事项(耿祥义)

jnlyseo998998 jnlyseo998998 发表于2023-03-18 01:14:02 浏览43 评论0

抢沙发发表评论

关于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,运行效果略。

耿祥义主要教材源代码暨习题解答下载