import java.util.ArrayList;
import java.util.List;
public class foclass4 {
/**
* @param args
*/
public static void main(String[] args) {
List<String> lists = new ArrayList<String>();
lists.add("ad");
lists.add("dv");
lists.add("dvs");
lists.add("adf");
for(String s:lists)
{
if(s.equals("ad"))
{
lists.remove(s);
continue;
}
System.out.println("删除后--"+s);
}
}
}
报错:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)
at java.util.AbstractList$Itr.next(AbstractList.java:343)
at foclass4.main(foclass4.java:13)
原因:
就是针对使用foreach的语法,你要用foreach这种语法就必须继承这个接口Iterator,这个接口很简单,就是返回迭代器Iterator,迭代器有个特点就是快速失败的,通过迭代器迭代不能去移除集合中元素
详细JDK
如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:
List list = Collections.synchronizedList(new ArrayList(...)); 此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。
注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。
可以从迭代器中移除
List<String> lists = new ArrayList<String>();
lists.add("ad");
lists.add("dv");
lists.add("dvs");
lists.add("adf");
Iterator<String> it=lists.iterator();
while(it.hasNext())
{
String str=it.next();
if("ad".equals(str))
{
it.remove();
}
else
{
System.out.println(str);
}
}
结果:
dv
dvs
adf
分享到:
相关推荐
低版本IE数组和HTMLCollection元素集合不兼容forEach循环遍历的处理方法 原生JavaScript通过name获取dom元素得到的是 HTMLCollection元素集合 要想循环遍历可以用forEach,但是在低于ie9的版本下不兼容 var list...
利用foreach循环显示数组所有元素,对foreach循环进行更深了解
在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。 集合已修改;可能无法执行枚举操作。 方法一:采用for循环,并且从尾到头遍历 如果...
java中foreach循环的使用方法!
本文将详细给大家关于C#中foreach循环对比for循环的优势和劣势,下面话不多说了,来一起看看详细的介绍吧。 一、foreach循环的优势 C#支持foreach关键字,foreach在处理集合和数组相对于for存在以下几个优势: 1、...
<php+mysql>PHP脚本条件判断,foreach循环,以及粘性表单
在每次循环中,我们使用echo语句输出当前元素的值,并在其后面添加一个换行符" "。最后,我们在浏览器中打开fruits.php文件,可以看到页面上显示了每个水果的名称,每个名称占一行。 这个代码的意义在于展示了...
在每次循环中,我们使用echo语句输出当前元素的值,并在其后面添加一个换行符" "。最后,我们在浏览器中打开fruits.php文件,可以看到页面上显示了每个水果的名称,每个名称占一行。 这个代码的意义在于展示了...
计算机后端-Java-Java核心基础-第24章 集合01 12. 新特性foreach循环遍历集合或数组.avi
ForEach 循环控制器是比较重要的逻辑控制器,但是一般不会单独使用需跟用户自定义的变量组件一起使用,ForEach 循环控制器从用户定义的变量中读取一系列相关的变量。该控制器下的采样器或控制器都会被执行一次或多...
Delphi Foreach循环的用法实例,演示如何使用For Each生成循环,用赋值于文本框控件中,程序试图使用多种方式生成Foreach,并最终清除它。本示例面向Delphi基础学者,了解Delphi基础知识的一些应用。
自己写的foreach,绝对可以用。 namespace for_reach循环实例 { class Program { static void Main(string[] args) { int[] a={1,2,3,4,5}; foreach (int x in a)
假设当我们只需知道某个数组有没有某个属性,如果找到了直接跳出循环,省略掉剩下的循环步骤是较优化的操作,但是for中是可以利用break跳出循环,但break在forEach中无效,那么forEach能不能跳出循环呢?当然是可以...
超全面javaweb教程28天第11,12天_7_forEach中的循环状态变量
PHP 数组 for foreach 循环 array_column函数.rar
看代码,再做解释复制代码 代码如下:<... 在foreach循环中,当循环结束后,$key和$val变量都不会自动释放掉。值会被保留下来。当foreach使用引用的情况下,会出现如下的情况,需要注意。复制代码
1.数据如下,提取name和callcount 2代码. getQueryCallStatistics(sesp1, this.provinceId).then((res) => { let arr = []; let arr1 = [];... res.data.callstatistics.forEach((element) => { // arr.p
Collection 是所以集合的基类,该实例主要对Collection集合的成员函数的练习以及Iterator和foreach的遍历集合的练习,试用与java/C++ 新手。。
这个小视频将详细告诉我们JAVA中如何正确使用1foreach循环
foreach循环用于列举出集合中所有的元素,foreach语句中的表达式由关键字in隔开的两个项组成。in右边的项是集合名,in左边的项是变量名,用来存放该集合中的每个元素。 该循环的运行过程如下:每一次循环时,从集合...