java循环遍历List时删除元素总结-程序员宅基地

技术标签: java  

在日常代码中,遍历List然后删除特定的元素是很常见的操作,Java中的循环主要有普通的for循环增加for循环iterator遍历这几种方法,我们知道在循环list时删除元素可能引起异常,这里总结下什么情况下会引起异常,什么情况不会引起异常。

1. for循环正序遍历list

for(int i=0;i<list.size();i++){
    if(list.get(i).equals("del"))
        list.remove(i);
}

这种方式的问题在于,删除某个元素后,list的大小发生了变化,而你的索引也在变化,所以会导致你在遍历的时候漏掉某些元素。比如当你删除第1个元素后,继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位,所以实际访问的是第3个元素。因此,这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用。

2. for循环倒序遍历list

for(int i=list.size()-1;i>=0;i++){
    if(list.get(i).equals("del"))
        list.remove(i);
}

由于正序遍历有以上的问题,这里可以采用倒序遍历的方法。因为在倒序遍历时,即使删除了某index元素,List中 0~index-1之间的元素并未变化,下次循环时获取的index-1的元素也是正确的,因此此种方法不会有问题。

3.增强for循环

for(String x:list){
    if(x.equals("del"))
        list.remove(x);
}

这种方式的问题在于,删除元素后继续循环会报错误信息ConcurrentModificationException,因为元素在使用的时候发生了并发的修改,导致异常抛出。但是删除完毕马上使用break跳出,则不会触发报错。

4.iterator遍历

Iterator<String> it = list.iterator();
while(it.hasNext()){
    String x = it.next();
    if(x.equals("del")){
        it.remove();
    }
}

这种方式可以正常的循环及删除。但要注意的是,使用iterator的remove方法,如果用list的remove方法同样会报上面提到的ConcurrentModificationException错误。

 

5. 先记录元素,后续执行删除。

以上都是在循环中删除某个元素的操作,在实际代码中如果怕出现问题,可以创建另外的一个List在遍历过程中记录需要删除的元素,然后根据这个List从原List删掉对应元素即可:

ArrayList<String> toRemoveList = new ArrayList<String>();
for (String str: list) {
    if (str.equals("del")) {
        toRemoveList.add(str);
    }
}

for (String removeStr : toRemoveList) {
    list.remove(removeStr);
}

 这样能保证不出问题,只是在执行效率上稍微低下,在对性能要求不高的情况下可以这样处理。

 

总结:

(1)循环删除list中特定一个元素的,可以使用三种方式中的任意一种,但在使用中要注意上面分析的各个问题。

(2)循环删除list中多个元素的,应该使用迭代器iterator方式 或 倒序遍历的方式。

 ( 3 )  先记录后删除的方式不会出问题,但是影响性能,视具体情况使用。

     

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ws6013480777777/article/details/93890011

智能推荐

DataGridView 定位行的问题_datagridview定位行不准-程序员宅基地

文章浏览阅读4.4k次。 添加,删除,查找之后希望 Grid定位到需要的行 Me.dgvPaper.Rows(i).Selected = True 设置能保证选中行,一旦找到了就定位到相应的位置,如果数据行很多的话,希望滚动条滚到相应的位置。 DataGridView控件有一个FirstDisplayedScrollingRowIndex属性,把需要定位的行index(N)赋值给这个属性之后,DataGridV_datagridview定位行不准

Mybatis插入数据行ID生成策略-程序员宅基地

文章浏览阅读127次。为什么80%的码农都做不了架构师?>>> ...

京东热-key-探测框架新版发布,单机-QPS-可达-35-万_jd-hotkey_AK774S的博客-程序员宅基地

文章浏览阅读3.6k次。还有一种热点数据的发现机制,那就是实时的做收集,比如在客户端、服务端或者在代理层,都可以对实时数据进行采集,然后进行统计汇总。达到一定的数量之后,就会被识别为热key如何解决热key问题解决热key问题最主要的方式就是加缓存。通过缓存的方式尽量减少系统交互,使得用户请求可以提前返回。这样即能提升用户体验,也能减少系统压力。缓存的方式有很多,有些数据可以缓存在客户的客户端浏览器中,有些数据可以缓存在距离用户就近的DNS中,有些数据可以通过Redis等这类缓存框架进行缓存,还有些数据可以通过服务器本地_jd-hotkey

SAE J1708协议-程序员宅基地

文章浏览阅读2k次。SAE J1708协议1.协议简介1708是SAE(Society of Automotive Engineers:美国机动车工程师学会)专门针对重型车辆(卡车和客车)起草文件中J标准规范之一,该协议旨在推广微控制器模块之间的通信标准规范。SAE J1708协议仅详细描述了OSI(Open System Interconnection:开放式系统互联)七层模型中的物理层和数据链路层。所以在进行通信时,常常需要与描述应用层的SAE J1587协议一起使用。图1-OSI模型 ..._j1708协议

卷积神经网络CNN(二)池化、结构、误差反向传播-程序员宅基地

文章浏览阅读7.2k次,点赞8次,收藏53次。上一篇介绍了CNN基本概念和卷积的知识,CNN的特征抽取除了包含卷积,还包含池化。池化池化又叫子采样,是特殊的卷积。池化比较好理解,还是上篇公司工作交接的例子,每个销售区域有100个老员工,我们可以先推举一个最懂本区域的业务人员参与交接(如各区域的领导),其他人员不必参与交接;或者每个区域内部先开一个会,把100个老员工的经验结合在一起,生成一个会议纪要,根据这份纪要与新员工交接。这实际对应两种池...

Java日志框架-程序员宅基地

文章浏览阅读92次。java很火,日志记录又是必需,因此就有了大量的日志记录框架,在日常使用时因为日志框架冲突引发各种问题,本文对之进行梳理,适合入门。由于作者水平限制,本文可能不够清晰甚至有错,烦请指出。在文章末尾的参考部分,有几位大牛总结的文章,推荐给大家。下文将着重介绍上述日志框架的区别,以及避免不同框架组合引入时的冲突。两个概念日志系统日志接口的具体实现。经典的有log4j,jdk自带的有java.u...

随便推点

PTA_L1-039 古风排版 (20分)_ptal1-039-程序员宅基地

文章浏览阅读392次,点赞2次,收藏2次。L1-039 古风排版 (20分)中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。输入格式:输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。输出格式:按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。输入样例:4This is a test case..._ptal1-039

开发岗校招求职攻略——面试准备(7.2胸有成竹-技术面技巧)_开发技术面技巧-程序员宅基地

文章浏览阅读822次,点赞5次,收藏3次。1 前言  当你踏入面试房间的第一只脚开始,你的一举一动就都在面试官眼里和心里了,从最开始的自我介绍,到最后结束面试时的提问,都不能草率对待。下面,我根据技术面的几种常见面试形式,分别介绍一些特有的技巧,并且会在此基础上再额外介绍一些通用技巧,来帮助你拿下面试。  2 一对一面试  技术面最常见的形式就是一对一的面试,一般的流程是这样的:你带着简历走进去,将简历送给面试官,面试官在浏览你简历的时候会要求你自我介绍。2、3分钟的自我介绍结束后就正式进入了面试环节,面试官会根据对你简历的理解程度询_开发技术面技巧

Flutter Slider 进度条-程序员宅基地

文章浏览阅读4.5k次。参数详解属性 说明 value 当前值 默认 0 -- 1 之间 onChanged 滑动监听 onChangeStart 滑动前监听 onChangeEnd 滑动后监听 min 最小值 默认 0 max 最大值 默认 1 divisions 分段个数 label 滑动时 显示的文字 (不设置divi...

Idea报错Command line is too long-程序员宅基地

文章浏览阅读403次。为什么80%的码农都做不了架构师?>>> ..._为什么会报错command line is too long

历届试题 买不到的数目(欧几里得 蓝桥杯)_最大不能买到的数量是17-程序员宅基地

文章浏览阅读1.3k次。历届试题 买不到的数目 时间限制:1.0s 内存限制:256.0MB问题描述小明开了一家糖果店。他别出心裁:把水果糖包成4颗一包和7颗一包的两种。糖果不能拆包卖。小朋友来买糖的时候,他就用这两种包装来组合。当然有些糖果数目是无法组合出来的,比如要买 10 颗糖。你可以用计算机测试一下,在这种包装情况下,最大不能买到的数量是17。大于17的任何数字都可以用4和7组合出来。本题的要求就是在已知两_最大不能买到的数量是17

常见支付宝、微信支付的使用流程_alipay.trade.precreate-程序员宅基地

文章浏览阅读1.1k次。支付宝:https://open.alipay.com/platform/home.htm微信:https://pay.weixin.qq.com/index.php/core/home/login?return_url=%2F银联:https://open.unionpay.com/ajweb/help/qrcodeFormPage各大银行:http://openhome.cmbchina..._alipay.trade.precreate