`

foreach 循环不能改变集合中各项的值

 
阅读更多
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
分享到:
评论

相关推荐

    foreach.js低版本IE数组和HTMLCollection元素集合不兼容forEach循环遍历的处理方法

    低版本IE数组和HTMLCollection元素集合不兼容forEach循环遍历的处理方法 原生JavaScript通过name获取dom元素得到的是 HTMLCollection元素集合 要想循环遍历可以用forEach,但是在低于ie9的版本下不兼容 var list...

    使用foreach循环

    可以看出,由于我们在 foreach 循环中对数组元素进行赋值,结果导致不能正确遍历数组元素,不能准确取出每个数组元素的值。 foreach 循环是 Java 语言中的一种简洁易用的循环结构,用于遍历数组和集合元素。但是,...

    foreach循环

    总结来说,`foreach`循环是编程语言中不可或缺的一部分,它提供了遍历数组和集合的简便方式,使得代码更加清晰和易于维护。无论是初学者还是经验丰富的开发者,掌握`foreach`循环的使用都是提高效率和代码质量的关键...

    C#在foreach遍历删除集合中元素的三种实现方法

    在foreach中删除元素时,每一次删除都会导致集合的大小和元素索引值发生变化,从而导致在foreach中删除元素时会抛出异常。 集合已修改;可能无法执行枚举操作。 方法一:采用for循环,并且从尾到头遍历 如果...

    JMETER ForEach循环控制器

    通常,`ForEach循环控制器`不会单独使用,而是与用户定义的变量组件结合,用于在测试过程中动态地改变采样器或控制器的参数。 ### ForEach循环控制器参数说明 1. **名称**:自定义控制器的名称,方便识别和管理。 ...

    13.foreach循环_java_

    `foreach`循环中,你不能直接修改正在遍历的元素。如果尝试这样做,编译器会抛出错误。例如,试图在循环中改变数组或集合的元素会报错。 4. **无法跳过元素或提前退出**: 由于`foreach`循环的底层实现,你不能...

    浅谈C#中的for循环与foreach循环

    值得注意的是,foreach循环是只读的,不允许在循环体内修改集合或数组的内容。这确保了遍历过程的稳定性和安全性。 对比两者,我们可以得出以下结论: - foreach循环专门用于遍历,而for循环可以用于任何需要重复...

    C#中foreach循环对比for循环的优势和劣势

    本文将详细给大家关于C#中foreach循环对比for循环的优势和劣势,下面话不多说了,来一起看看详细的介绍吧。 一、foreach循环的优势 C#支持foreach关键字,foreach在处理集合和数组相对于for存在以下几个优势: 1、...

    For 和 Foreach 的效率问题

    在编程语言中,`for`和`foreach`循环是两种常用的迭代工具,它们在处理集合或数组时发挥着重要作用。本文将深入探讨`for`和`foreach`在C#中的效率差异,以及如何根据具体场景选择合适的循环方式。 首先,`for`循环...

    PHP 数组 for foreach 循环 array_column函数.rar

    `for`和`foreach`循环是处理数组的两种主要方式,而`array_column`函数则是一个强大的工具,允许我们从多维数组中提取特定列的数据。 1. **for循环**:在PHP中,`for`循环通常用于迭代已知次数的情况。它的语法结构...

    <php+mysql>PHP脚本条件判断,foreach循环,以及粘性表单

    &lt;php+mysql&gt;PHP脚本条件判断,foreach循环,以及粘性表单

    Java 实例 - for 和 foreach循环使用源代码-详细教程.zip

    本教程将深入探讨两种常见的循环类型:`for`循环和`foreach`循环,它们在处理数组、集合和其他迭代场景时非常有用。 ### 1. `for`循环 `for`循环是最灵活的循环结构之一,适用于各种迭代需求。其基本语法如下: `...

    浅析java的foreach循环

    需要注意的是,foreach循环的一个限制是它并不适用于修改正在遍历的数组或集合。例如,以下代码尝试在循环中改变数组元素: ```java for (String book : books) { book = "hello world!"; System.out.println...

    计算机后端-Java-Java核心基础-第24章 集合01 12. 新特性foreach循环遍历集合或数组.avi

    计算机后端-Java-Java核心基础-第24章 集合01 12. 新特性foreach循环遍历集合或数组.avi

    c#中Foreach详细用法

    Foreach语句是C#语言中的一种循环语句,它提供了一个简洁高效的方式来遍历数组、集合、列表等数据结构。在本文中,我们将详细介绍Foreach语句的用法和优点,并与传统的for循环语句进行比较。 一、Foreach语句的基本...

    关于foreach循环中遇到的问题小结

    * foreach循环中不能修改集合对象的元素。 * foreach循环中可以使用step属性来指定迭代步长。 5.实例代码解析 以下是一个使用foreach循环的实例代码: ```html ();" value="checkbox"&gt; 全选 样本...

    php foreach循环中使用引用的问题

    因此,当我们在循环外修改`$val`的值时,`$array[3]`的值也随之改变,变为'e'。 这种行为在某些情况下可能是有用的,比如当我们需要在循环中修改数组元素,但需要注意的是,如果不正确地处理,它也可能引发意料之外...

    c#Foreach.rar

    在C#编程语言中,`foreach`循环是一个非常重要的控制流结构,用于遍历集合、数组或枚举类型的元素。这个`c#Foreach.rar`压缩包包含了一个名为`foreach.txt`的文本文件,很可能是对`foreach`用法的简要说明。在这里,...

    forEach中为什么不能删除元素解决方案.pdf

    首先,了解为什么在`forEach`循环中不能直接修改集合是很重要的。Java集合框架中的`forEach`循环是基于迭代器的`hasNext()`和`next()`方法实现的。在迭代过程中,如果检测到集合的结构发生了变化(即被修改了),...

    java 使用foreach遍历集合元素的实例

    这是因为`foreach`循环依赖于迭代器,而迭代器不支持在遍历过程中修改集合。 6. **避免异常的方法**:要安全地在遍历过程中移除元素,可以使用`Iterator`接口。例如,可以获取`books`的迭代器,然后在循环中调用`...

Global site tag (gtag.js) - Google Analytics