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

#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循环中删除一个列表元素相关推荐

  1. java数组中删除元素或一个数组元素

    java数组中删除元素或一个数组元素 删除数组中单个元素 删除数组中多个元素(数组表示) 这里直接介绍两种情况: 1.删除数组中单个元素 2.删除数组中多个元素(数组表示) 删除数组中单个元素 1. ...

  2. python统计列表中元素个数_python中计算一个列表中连续相同的元素个数方法

    python中计算一个列表中连续相同的元素个数方法 最简单的例子: a = [1,1,1,1,2,2,2,3,3,1,1,1,3] # 问:计算a中最多有几个连续的1 很明显,答案是4 如果用代码实现 ...

  3. linux数组删除数据,JavaScript在数组的循环中删除元素

    在开发JavaScript应用的过程中,经常会遇到在循环中移除指定元素的需求. 按照常规的思路,就是对数组进行一个for循环,然后在循环里面进行if判断,在判断中删除掉指定元素即可. 但是实际情况往往 ...

  4. java字符串删掉子串_如何从Java中的列表中删除子列表?

    java字符串删掉子串 从列表中删除子列表 (Removing SubList from a List) Suppose, we have a list of few elements like th ...

  5. mysql for 循环删除_Java增强for循环中删除元素抛异常问题

    前言 最近突然想起刚毕业那会找工作时面试被问了个这样的问题.就是"使用增强for循环遍历ArrayList(List集合)时删除其中的元素是否会出现异常?".说实话当时真把我愣住了 ...

  6. 在 PHP 中从数组中删除一个元素

    问: 有没有一种简单的方法可以使用 PHP 从数组中删除一个元素,从而使 foreach ($array) 不再包含该元素? 我认为将它设置为 null 会做到这一点,但显然它不起作用. 答1: hu ...

  7. 如何从 Java 的 List 中删除第一个元素

    概述 在这个实例中,我们将会演示如何删除在 Java 中定义的 List 的第 1 个元素. 我们将会针对这个问题使用 List 接口的 2 个实现 ArrayList 和 LinkedList 来进 ...

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

    在开发JavaScript应用的过程中,经常会遇到在循环中移除指定元素的需求. 按照常规的思路,就是对数组进行一个for循环,然后在循环里面进行if判断,在判断中删除掉指定元素即可. 但是实际情况往往 ...

  9. 遍历Collection,避免在循环中删除对象时避免ConcurrentModificationException

    我们都知道,由于ConcurrentModificationException您无法执行以下操作: for (Object i : l) {if (condition(i)) {l.remove(i) ...

最新文章

  1. Docker网络解决方案-Flannel部署记录
  2. 如何在FreeBSD中安装Nginx,MySQL,PHP(FEMP)
  3. 看了AI种草莓,我想回去当农民
  4. 配置FindBugs和常见FindBugs错误
  5. 加速国内 Github 访问,下载的9种方案!
  6. dsp呼吸灯C语言编程,DSP28335 呼吸灯程序
  7. 当公司辞掉85后测试员选择95后测试员后...
  8. 多媒体计算机音频怎么连接,解决电脑连多媒体为什么没有声音
  9. 如何给计算机c盘加内存,电脑C盘内存太小_这个方法教你扩大C盘空间 - 驱动管家...
  10. 高景一号01星遥感影像解译数据分辨率是多少
  11. Android studio 运行警告 We recommend using a newer Android Gradle plugin to use compileSdk = 33
  12. 【MM小贴士】定义采购申请类型
  13. android 圆动画效果,Android实现任意绕圆或椭圆旋转的动画——SatelliteAnimator使用介绍...
  14. IT人士常喝点菊花茶泡枸杞
  15. 链接器lds文件简介
  16. 学无止境啊,身体是革命本钱
  17. shell——判断文件是否存在
  18. 深圳市科技创新委员会关于印发《深圳市科学技术奖四类奖项实施细则》的通知
  19. 信创操作系统--麒麟Kylin桌面版 (项目二 桌面环境)
  20. 完美解码(超强多功能播放器) v20190811官方无广告纯净版

热门文章

  1. 阳台花园不只美丽-东方美琪·安琪:身心健康谋定心灵升华
  2. 【AtCoder】diverta 2019 Programming Contest 2
  3. ubuntu系统阅读CHM文档的最终解决方案
  4. 算法设计7—哈希表1
  5. 【iCore4 双核心板_ARM】例程三十八:DSP MATH库测试
  6. js 导出到excel
  7. 判断滚动条是否到某个位置,还有滑动的方向,以此来判断什么时候阻止滚动条滚动...
  8. Code Generate of Power Designer[转]
  9. “猜你喜欢” — 浅谈内容分发中的推荐系统
  10. PMCAFF高端俱乐部首次集结,最顶级产品人的私密俱乐部!