这个问题看似好像挺简单挺幼稚的,然而就这个幼稚的问题还曾经困扰过我一阵呢,其实犯这个错误的根本原因是我们对于基础知识的理解和掌握上还有不足的表现,基本功有些人总是觉得不重要,认为更多的扩大学习的广度才是最重要的,我认为这是很容易犯的,同时也是很致命的错误观点!

对基础知识掌握不牢靠,或理解不深刻,写出的代码必然会有40%的概率是错误的、低效的,一段代码不是说没有编译错误就一定是对的,不是说简单的运行下就一定是对的,优秀的代码,是经得起“刀山火海”般的考验的(“多线程、效率、安全”这三坐大山)。

所以重要性,我就不再强调了,相信说完后,地球人都能懂我的意思,那么下面就来看看这个有趣的现象吧。

先看看如下代码

import java.util.ArrayList;

import java.util.Iterator;

import java.util.List;

public class TestList {

void init(List list) {

list.clear();

for (int i = 0; i

list.add(i + 1);

}

}

void remove(List list) {

for (int i = 0; i

list.remove(i);

}

}

void removeTwo(List list) {

for (int i : list) {

if (i

list.remove(i);

}

}

}

void removeThree(List list) {

for (Iterator iter = list.iterator(); iter.hasNext();) {

int i = iter.next();

if (i

iter.remove();

}

}

}

public static void main(String[] args) {

TestList testList = new TestList();

List list = new ArrayList();

// 第一种方法

testList.init(list);

testList.remove(list);

System.out.println(list);

// 第二种方法

try {

testList.init(list);

testList.removeTwo(list);

System.out.println(list);

} catch (Exception e) {

e.printStackTrace();

}

// 第三种方法

testList.init(list);

testList.removeThree(list);

System.out.println(list);

}

}

运行的结果如下:

[2, 4, 6, 8, 10]

java.util.ConcurrentModificationException

at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372)

at java.util.AbstractList$Itr.next(AbstractList.java:343)

at com.TestList.removeTwo(TestList.java:23)

at com.TestList.main(TestList.java:60)

[6, 7, 8, 9, 10]

上面代码逻辑很简单,就是将List集合里的前5个对象删除掉,然而结果却是相当不一样:第一个是错误的结果,第二个直接报异常,只有第三个是我们想要的结果!

那么这是为什么呢?其实主要原因来自于List中的remove()方法。我们来分析一下:

第一种方法:

第一次执行完remove方法后,并不像我们简单想象的那样就把第一个删除了,“1”这个对象被删除了没错,但是当被删除后List中“2”以后的9个对象的index索引也变了,都比原来的值减一,换句话说就是剩下的9个对象的index值为从0到8,而不是原来的从1到9了,那么第二次执行remove方法时,此时list.remove(1)删除的就是“3”这个对象(“3”的index值为1),而不是我们想象的删除“2”对象。

第二种方法:

原因跟上面一样,导致List的next()方法内部出现modCount和expectedModCount不一致导致抛出异常。

所以我们这里建议大家采用第三种方法来删除List集合中某一个对象,这样做是最简单且容易记忆的。那第一种方法和第二种方法有没有解决的办法呢?目前我知道第一种方法的解决办法,第二种应该是无解的(因为语法结构导致)。

第一种方法的改进措施:

void remove(List list) {

int num = list.size() - 5;

for (int i = 0; i

list.remove(i);

i--;

num--;

}

}

我想你编程时间长了,也会偶尔遇到这些类似简单却让你头疼的问题,遇到这些问题首先检查下自己的逻辑是否有问题,如果逻辑没有问题就检查下代码的结构是否有问题吧,这就是所谓的基本功,以后我也会慢慢的加强巩固自己基本功方面的能力,一起加油吧。

java abstractnumlist_如何从List集合中删除对象相关推荐

  1. list java removeif_java – removeIf()方法.从List中删除所有元素

    我有一个用户列表,我想从我的列表中删除id为 其实我这样做: [...] int pid1 = 1; int pid2 = 2; int pid3 = 3; Predicate personPredi ...

  2. 从List集合中删除指定元素

    从List集合中删除指定元素的几种方式 最近在使用这个操作的时候搜索了一下网上的文章,发现有些能用有些不能用, 由于使用之前没有做详细的测试,导致程序bug,今天抽空做了一下总结和测试. packag ...

  3. 有3个集合, 从其中一个集合中删除同时存在于另外两个集合的元素

    如下分享的邮件,在博客园做个记录,以便以后使用. 在这里,其实也想倡导一下程序员要具有的分享精神.鼓励大家多分享,平时有什么新的收获,最好在team里做个分享 .分享也是一种很好的事情.对团队来说,可 ...

  4. ruby 数组元素替换_从Ruby中的集合中删除并替换元素

    ruby 数组元素替换 Ruby has various specific methods to fulfil specific tasks. At several places, you may n ...

  5. java同名变量在list中添加两次_去除集合中自定义对象的重复值(对象的成员变量值都相同)...

    package cn.itcast_04; import java.util.ArrayList; import java.util.Iterator; /* * 需求:去除集合中自定义对象的重复值( ...

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

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

  7. List集合中的对象根据属性排序

    List集合中的对象根据属性排序 集合类List存放的数据,默认是按照放入时的顺序存放的,比如依次放入A.B.C,则取得时候,则也是A.B.C的顺序,实际场景中,有时我们需要根据自定义的规则对List ...

  8. 在JavaScript中删除对象

    本文翻译自:Deleting Objects in JavaScript I'm a bit confused with JavaScript's delete operator. 我对JavaScr ...

  9. es6删除对象的属性_javascript - 按对象属性从数组中删除对象

    javascript - 按对象属性从数组中删除对象 var listToDelete = ['abc', 'efg']; var arrayOfObjects = [{id:'abc',name:' ...

最新文章

  1. hive中的绣花模型_hive建模方法
  2. 程序与生活:程序员要保持好奇心
  3. 解决ssh使用一段时间断开的问题
  4. 容器中Java RAM的使用:不会丢失内存的5大技巧
  5. 如何下载谷歌浏览器官方最新离线安装包
  6. [DataAnalysis]机器学习数据类型和数据质量
  7. 3.新建页面以及添加路由 2021-07-11
  8. grep 查找内容有特殊字符怎么办
  9. android MVX杂谈
  10. QQ、微信、QQ浏览器UserAgent
  11. 北通手柄连接电脑没反应_北通手柄连接电脑教程
  12. python 关于sys.argv[1]语句报错IndexError: list index out of range的解决
  13. flink Too many fields referenced from an atomic type
  14. Maven当中resources标签的用法
  15. unity avprovideo插件的使用
  16. 斗鱼直播地址抓取——转载
  17. [BZOJ4668]冷战
  18. gitlab-ci添加安卓项目构建流程
  19. 过完这个元宵节 记得换一种方式陪伴你爱的人
  20. (SCA)正弦余弦算法SCA: A Sine Cosine Algorithm(代码可复制粘贴)

热门文章

  1. java 校验护照_【示例教程】如何使用LEADTOOLS 的JAVA接口从护照中识别和提取数据...
  2. Wordpress 修改 mysql 插件_史上最详细的WordPress安装教程(三):安装php 5.6及fpm、pdo、mysql等插件...
  3. ZZULIOJ 1067:有问题的里程表
  4. OpenJudge NOI 1.6 07:有趣的跳跃
  5. 信息学奥赛一本通 1979:【18NOIP普及组】龙虎斗 | 洛谷 P5016 [NOIP2018 普及组] 龙虎斗
  6. 信息学奥赛一本通(1032:大象喝水查)
  7. 重排列(51Nod-2513)
  8. 动态规划 —— 树形 DP
  9. 暑期训练日志----2018.8.24
  10. 倒序数(信息学奥赛一本通-T1160)