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()方法前,是能够用的。
Java循环中删除一个列表元素相关推荐
- java数组中删除元素或一个数组元素
java数组中删除元素或一个数组元素 删除数组中单个元素 删除数组中多个元素(数组表示) 这里直接介绍两种情况: 1.删除数组中单个元素 2.删除数组中多个元素(数组表示) 删除数组中单个元素 1. ...
- python统计列表中元素个数_python中计算一个列表中连续相同的元素个数方法
python中计算一个列表中连续相同的元素个数方法 最简单的例子: a = [1,1,1,1,2,2,2,3,3,1,1,1,3] # 问:计算a中最多有几个连续的1 很明显,答案是4 如果用代码实现 ...
- linux数组删除数据,JavaScript在数组的循环中删除元素
在开发JavaScript应用的过程中,经常会遇到在循环中移除指定元素的需求. 按照常规的思路,就是对数组进行一个for循环,然后在循环里面进行if判断,在判断中删除掉指定元素即可. 但是实际情况往往 ...
- java字符串删掉子串_如何从Java中的列表中删除子列表?
java字符串删掉子串 从列表中删除子列表 (Removing SubList from a List) Suppose, we have a list of few elements like th ...
- mysql for 循环删除_Java增强for循环中删除元素抛异常问题
前言 最近突然想起刚毕业那会找工作时面试被问了个这样的问题.就是"使用增强for循环遍历ArrayList(List集合)时删除其中的元素是否会出现异常?".说实话当时真把我愣住了 ...
- 在 PHP 中从数组中删除一个元素
问: 有没有一种简单的方法可以使用 PHP 从数组中删除一个元素,从而使 foreach ($array) 不再包含该元素? 我认为将它设置为 null 会做到这一点,但显然它不起作用. 答1: hu ...
- 如何从 Java 的 List 中删除第一个元素
概述 在这个实例中,我们将会演示如何删除在 Java 中定义的 List 的第 1 个元素. 我们将会针对这个问题使用 List 接口的 2 个实现 ArrayList 和 LinkedList 来进 ...
- javascript在数组的循环中删除元素
在开发JavaScript应用的过程中,经常会遇到在循环中移除指定元素的需求. 按照常规的思路,就是对数组进行一个for循环,然后在循环里面进行if判断,在判断中删除掉指定元素即可. 但是实际情况往往 ...
- 遍历Collection,避免在循环中删除对象时避免ConcurrentModificationException
我们都知道,由于ConcurrentModificationException您无法执行以下操作: for (Object i : l) {if (condition(i)) {l.remove(i) ...
最新文章
- Docker网络解决方案-Flannel部署记录
- 如何在FreeBSD中安装Nginx,MySQL,PHP(FEMP)
- 看了AI种草莓,我想回去当农民
- 配置FindBugs和常见FindBugs错误
- 加速国内 Github 访问,下载的9种方案!
- dsp呼吸灯C语言编程,DSP28335 呼吸灯程序
- 当公司辞掉85后测试员选择95后测试员后...
- 多媒体计算机音频怎么连接,解决电脑连多媒体为什么没有声音
- 如何给计算机c盘加内存,电脑C盘内存太小_这个方法教你扩大C盘空间 - 驱动管家...
- 高景一号01星遥感影像解译数据分辨率是多少
- Android studio 运行警告 We recommend using a newer Android Gradle plugin to use compileSdk = 33
- 【MM小贴士】定义采购申请类型
- android 圆动画效果,Android实现任意绕圆或椭圆旋转的动画——SatelliteAnimator使用介绍...
- IT人士常喝点菊花茶泡枸杞
- 链接器lds文件简介
- 学无止境啊,身体是革命本钱
- shell——判断文件是否存在
- 深圳市科技创新委员会关于印发《深圳市科学技术奖四类奖项实施细则》的通知
- 信创操作系统--麒麟Kylin桌面版 (项目二 桌面环境)
- 完美解码(超强多功能播放器) v20190811官方无广告纯净版
热门文章
- 阳台花园不只美丽-东方美琪·安琪:身心健康谋定心灵升华
- 【AtCoder】diverta 2019 Programming Contest 2
- ubuntu系统阅读CHM文档的最终解决方案
- 算法设计7—哈希表1
- 【iCore4 双核心板_ARM】例程三十八:DSP MATH库测试
- js 导出到excel
- 判断滚动条是否到某个位置,还有滑动的方向,以此来判断什么时候阻止滚动条滚动...
- Code Generate of Power Designer[转]
- “猜你喜欢” — 浅谈内容分发中的推荐系统
- PMCAFF高端俱乐部首次集结,最顶级产品人的私密俱乐部!