Java循环中删除一个列表元素

本文主要想讲述一下我对之前看到一篇文章的说法。假设跟你的想法有出入,欢迎留言。一起讨论。

#3. 在循环中删除一个列表元素

  考虑以下的代码。迭代过程中删除元素:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
for (int i = 0; i < list.size(); i++) {
	list.remove(i);
}
System.out.println(list);

  这段代码的输出是:

[b, d]

  这种方法有一个严重的问题。当元素被移除,该列表的大小缩减。元素索引也随之发生了变化。所以,假设你想通过使用索引来删除一个循环内的多个元素。就会导致错误的结果。

  你可能猜到能够使用iterator来删除循环中的元素。

在Java中的foreach循环的工作原理就像一个iterator。 可是在这里也会错误发生。

请看以下的代码:

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
 
for (String s : list) {
	if (s.equals("a"))
		list.remove(s);
}

  上面的foreach loop代码会抛出一个异常ConcurrentModificationException. 可是以下这段代码不会。

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
Iterator<String> iter = list.iterator();
while (iter.hasNext()) {
	String s = iter.next();
 
	if (s.equals("a")) {
		iter.remove();
	}
}

  通过分析ArrayList.iterator()的原代码,我们能够发现next()方法必需要在remove()方法前被调用。

在foreach loop中。编译器产生的代码会先调用next()方法,从而产生异常。

以上这段是拷贝过来的。可是我自己去看了源代码以及測试过后,发现并非这样。

不是由于先调用next()方法或者先调用remove()方法导致出错。而是remove()和remove(Object o)之间的差异。查看源代码,能够看到remove()方法里有一个“expectedModCount = modCount;”语句;而在remove(Object o)方法是这种“modCount++;”它没有对expectedModCount做处理。导致在checkForComodification()方法推断“expectedModCount == modCount”时出错。

所以无论在什么时候,仅仅要你调用了remove(Object
o)方法,然后又调用了next()方法。都一定会报ConcurrentModificationException这个异常的。

上面所说的“上面的foreach
loop”的情况就是属于这一现象。

大家能够试一下将remove()方法摆在next()方法前,是能够用的。

时间: 2024-07-31 10:41:26

Java循环中删除一个列表元素的相关文章

在一个循环中从一个列表里删除一个元素

ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));Iterator<String> iter = list.iterator();while (iter.hasNext()) { String s = iter.next(); if (s.equals("a"

Python删除一个列表元素的方法

参考资料: https://www.cnblogs.com/xiaodai0/p/10564956.html https://www.cnblogs.com/huangbiquan/articles/7740894.html 1.remove: 删除单个元素,删除首个符合条件的元素,按值删除 举例说明: >>> str=[1,2,3,4,5,2,6] >>> str.remove(2) >>> str [1, 3, 4, 5, 2, 6] 2.pop:

javascript在数组的循环中删除元素

在开发JavaScript应用的过程中,经常会遇到在循环中移除指定元素的需求. 按照常规的思路,就是对数组进行一个for循环,然后在循环里面进行if判断,在判断中删除掉指定元素即可. 但是实际情况往往不会像预想的那样顺利运行. 出现的问题场景还原 (function () { var arr = [1, 2, 2, 3, 4, 5]; for (var i = 0; i < arr.length; i++){ // 打印数组中的情况,便于跟踪数组中数据的变化 console.log(i + '

js在数组中删除重复的元素自保留一个

js在数组中删除重复的元素自保留一个 第一种思路是:遍历要删除的数组arr, 把元素分别放入另一个数组tmp中,在判断该元素在arr中不存在才允许放入tmp中 用到两个函数:for ...in 和 indexOf() 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <script type="text/javascript"> var student = ['qiang','ming','tao','li','liang','you','qiang'

python基础一 ------如何统计一个列表元素的频度

如何统计一个列表元素的频度 两个需求: 1,统计一个随机序列[1,2,3,4,5,6...]中的出现次数前三的元素及其次数 2,统计一片英文文章中出现次数前10 的单词 两种方法: 1,普通的for循环,结合前边 python基础一 -------如何在列表字典集合中根据条件筛选数据的内容 2,自带库 collections 的counter 方法 解决需求一,两种方法 一: 先生成一个随机的列表,通过方法一获取最大元素 获取最多元素 重点讲解第二种方法 1,先导入 from collectio

javascript删除一个html元素节点代码实例

javascript删除一个html元素节点代码实例:本章节介绍一下如何利用原生javascript实现删除一个指定的html元素.代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www.softwhy.com/" /> <title&

二叉树中删除一个节点

二叉树的删除可以算是二叉树最为复杂的操作,删除的时候要考虑到很多种情况: 1.被删除的节点是叶子节点 2.被删除的节点只有左孩子节点 3.被删除的节点只有右孩子节点 4.被删除的有两个孩子节点 所以在删除的时候,这4种情况都必须考虑进去,并且这4中情况之下,还会有细的划分,下面就细说怎么删除. 在二叉树中想要删除一个节点,首先需要找到这个节点,由于二叉树在插入节点的时候会遵循一个原则,就是利用节点的值来判断 节点将被插入的位置(或者给节点加一个key,用key来判断).从根节点开始往下走,比当前

从ACM中删除一个已经创建的Library

从ACM中删除一个已经创建的Library,无法通过界面操作,需要手工从DB中删除.需要删除的表记录有: RECENTUPDATE 找到字段Name等于该libraryName的那条记录删除掉 delete from RECENTUPDATE where NAME='techair'; CONTAINERTEAM 对应一条记录 delete from CONTAINERTEAM where NAME like '%techair%'; WTLIBRARY 对应一条记录 delete from W

如何在java代码中调用一个web项目jsp或者servlet

有时候需要调用一个web项目的jsp或者servlet,但是执行内部的代码,并不是打开jsp,例如需要在一段java代码中清除一个web项目中的缓存,那么可以把清除缓存的代码放在该web项目的一个servlet中,只需要执行如下代码: URL url = new URL("http://192.168.2.123:8080/sace/ClearCache"); url.openStream(); openStream() 执行一次相当于一次URL请求,其中url.openStream(