`

集合遍历中删除元素问题

阅读更多
为什么 public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>(Arrays.<Integer>asList(1,2,3,5));
for(Integer l:list){
if(l==3){
list.remove(l);
}
}
System.out.println(list);

}
不抛异常,而
public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>(Arrays.<Integer>asList(1,2,3,5,6));
for(Integer l:list){
if(l==3){
list.remove(l);
}
}
System.out.println(list);

}
就抛Exception in thread "main" java.util.ConcurrentModificationException
at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)
at java.util.AbstractList$Itr.next(AbstractList.java:420)
at Test3.main(Test3.java:11)
???实在想不明白
分享到:
评论
3 楼 tjc 2009-01-04  
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

public class Test {
	public static void main(String[] args) {
		System.out.println("\n-------test1");
		test1();
		System.out.println("\n-------test2");
		test2();
		System.out.println("\n-------test3");
		test3();
		System.out.println("\n-------test4");
		test4();
	}

	public static void test1() {
		List<Integer> list = new ArrayList<Integer>(Arrays.<Integer> asList(1, 2, 3, 5));
		for (Integer l : list) {
			//attention here!
			System.out.println(l);
			if (l == 3) {
				list.remove(l);
			}
		}
		System.out.println(list);
	}

	public static void test2() {
		List<Integer> list = new ArrayList<Integer>(Arrays.<Integer> asList(1, 2, 3, 5));
		for (Integer l : list) {
			System.out.println(l);
			// remove the "list.remove()" code
			// if (l == 3) {
			// list.remove(l);
			// }
		}
		System.out.println(list);
	}

	public static void test3() {
		List<Integer> list = new ArrayList<Integer>(Arrays.<Integer> asList(1, 2, 3, 5, 6));
		try {
			for (Integer l : list) {
				System.out.println(l);
				if (l == 3) { //Exception throws here
						list.remove(l);
				}
			}
		} catch (Exception e) {
				System.out.println("throw exception "+e.getMessage());;
		}
		System.out.println(list);
	}
	public static void test4() {
		List<Integer> list = new ArrayList<Integer>(Arrays.<Integer> asList(1, 2, 3, 5, 6));
		for (Iterator iterator = list.iterator(); iterator.hasNext();) {
			Integer i = (Integer)iterator.next();
			System.out.println(i);
			if (i == 3) { //Exception throws here
					//list.remove(l);
				iterator.remove();
			}
		}
		System.out.println(list);
	}
}



output:
-------test1
1
2
3 //(1)
[1, 2, 5]

-------test2
1
2
3
5
[1, 2, 3, 5]

-------test3
1
2
3
throw exception null
[1, 2, 5, 6]

-------test4
1
2
3(2)
5
6
[1, 2, 5, 6]

注意(1)和(2)两处的区别
另请思考这篇文章http://lggege.iteye.com/blog/249430
2 楼 longrm 2009-01-04  
jubin 写道
从现象来看,第一个序列在3之后只有一个数字,而第二个序列在3之后有两个数字!
估计是在删除3之前,遍历的下一个操作数是5,而在删除3之后下一个操作数变成了6,所有出现了并发修改异常!
个人感觉foreach的设计不如.net的严谨,.net的策略是在foreach这样的遍历操作过程中,不允许对集合进行修改!

两次remove是并发操作么?怎么看起来是个前后连续的操作?
1 楼 jubin 2009-01-04  
从现象来看,第一个序列在3之后只有一个数字,而第二个序列在3之后有两个数字!
估计是在删除3之前,遍历的下一个操作数是5,而在删除3之后下一个操作数变成了6,所有出现了并发修改异常!
个人感觉foreach的设计不如.net的严谨,.net的策略是在foreach这样的遍历操作过程中,不允许对集合进行修改!

相关推荐

    C#遍历List并删除某个元素的方法

    当我们需要遍历List并根据条件删除特定元素时,需要注意正确的方法,以避免在遍历过程中出现错误。以下将详细介绍如何在C#中遍历List并删除元素,包括正序和倒序遍历的技巧。 首先,我们来看一下错误的遍历方式。...

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

    如果从头到尾正序遍历删除的话,有些符合删除条件的元素会成为漏网之鱼; 正序删除举例: List&lt;string&gt; tempList = new List() { "a","b","b","c" }; for (int i = 0; i &lt; tempList.Count; i++) { if ...

    C# 集合对象遍历性能测试

    在“TraversalPerformance.csproj”项目中,可能包含了编写这些集合遍历性能测试的代码。通过分析“Program.cs”和“Form1.cs”文件,我们可以找到测试用例的实现,包括遍历循环的逻辑和性能计时。`Form1.Designer....

    使用Iterator接口遍历集合元素

    hasNext() 方法用于判断集合中是否还有未被遍历的元素,next() 方法用于返回集合中的下一个元素,remove() 方法用于删除集合中的上一个元素。 Iterator 接口主要用于遍历集合元素,而不是提供盛装对象的能力。因此...

    Java Collection集合遍历运行代码实例

    Java Collection 集合遍历的优点是可以灵活地处理集合中的元素,例如可以根据需要对元素进行过滤、排序、分组等操作。此外,使用 Iterator 迭代器可以避免使用索引来访问集合元素,从而提高遍历的效率。 在实际开发...

    .遍历DOM元素

    1. 操作DOM:遍历DOM可以方便地查找特定节点,添加、删除或修改元素。 2. 渲染动画:遍历DOM可以实现复杂的动画效果,比如逐个改变元素样式。 3. 数据绑定:在MVVM框架中,遍历DOM用于将数据绑定到视图。 4. 事件...

    java中循环遍历删除List和Set集合中元素的方法(推荐)

    这种方法通过获取集合的Iterator,并在循环中使用`iterator.remove()`方法删除元素,避免了并发修改的问题。 ```java List&lt;CheckWork&gt; list = this.getUserDao().getAll(); Iterator&lt;CheckWork&gt; chk_it = list....

    HashMap和List遍历方法及如何遍历删除元素总结

    要解决List遍历删除元素的问题,可以使用Iterator来遍历List,并使用Iterator的remove方法来删除元素。这样可以避免ConcurrentModificationException异常。 HashMap的遍历方法 1. 使用keySet()方法 使用keySet()...

    C#集合遍历时删除和增加元素的方法

    总结起来,处理C#集合遍历过程中的元素修改,特别是删除和增加操作,需要使用支持在遍历中修改的集合类型,如`LinkedList&lt;T&gt;`,并且在操作过程中需要特别注意元素引用的更新,以避免数据丢失或遍历错误。在实际编程...

    遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置

    当你在一个迭代器正在遍历集合的过程中添加或删除元素时,就会抛出这个异常。这个问题在单线程环境下不会出现,但在多线程并发场景下,如果多个线程同时修改一个集合,就可能导致`ConcurrentModificationException`...

    正确遍历删除List中的元素方法(推荐)

    总结,遍历删除List元素时,推荐使用Iterator,因为它提供了安全的遍历和修改集合的机制。对于仅删除一个元素的情况,可以使用增强的for循环配合`break`。然而,对于多元素删除,避免在增强的for循环中直接删除,...

    66丨迭代器模式(中):遍历集合的同时,为什么不能增删集合元素?1

    为了解决这个问题,Java中的`List`接口提供了`remove()`方法的另一种版本——`Iterator.remove()`,这个方法可以安全地在遍历过程中删除当前元素。这是因为迭代器在调用`remove()`时,会更新自身的状态以反映元素已...

    C#遍历集合与移除元素的方法

    在C#编程中,遍历集合和移除元素是常见的操作,尤其在处理大量数据时。本篇文章将详细讲解如何使用C#有效地遍历集合并安全地移除元素,同时提供一些最佳实践。 首先,我们要了解C#中的两种主要遍历集合的方式:`for...

    java集合类遍历的同时如何进行删除操作.docx

    - 避免在遍历过程中直接修改集合:可以先将要删除的元素存储在一个临时列表中,遍历完成后,再一次性从原始集合中移除这些元素。 - 创建集合副本:如果只需要处理副本而不影响原始集合,可以在遍历前创建一个集合...

    去除链表重复元素-Java 实现

    在遍历链表的过程中,我们将每个元素与集合中的元素进行比较,如果发现重复,则删除链表中的该元素。 在这段代码中,LinkedList类包含一个removeDuplicates方法,用于去除链表中的重复元素。我们使用一个HashSet来...

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

    在本实例中,我们将深入探讨如何使用`foreach`循环遍历集合元素,并理解其工作原理以及可能遇到的问题。 首先,让我们看下给出的代码示例: ```java import java.util.*; public class ForeachTest { public ...

    在list集合中输入元素,去除重复的元素并输出

    这种方法通过迭代器(Iterator)来遍历列表,并在遍历过程中删除重复的元素。这种方式可以有效地避免`ConcurrentModificationException`异常。 ```java Iterator&lt;Integer&gt; iterator = list.iterator(); while ...

    完美解决python遍历删除字典里值为空的元素报错问题

    - Python中的字典是一种无序的键值对集合。 - 遍历字典时,可以使用 `for` 循环结合 `keys()`、`values()` 或 `items()` 方法来实现。 **1.2 删除字典中的元素** - 使用 `del` 语句可以删除字典中的指定键值对。 - ...

    Python简单遍历字典及删除元素的方法

    本文将深入探讨如何遍历字典以及安全地删除元素,以避免在迭代过程中修改字典时出现的错误。 首先,我们来看一个常见的问题:在遍历字典的同时尝试删除元素。以下代码在Python2中可能会工作,但在Python3中会导致`...

Global site tag (gtag.js) - Google Analytics