大家好,我是堆栈管理员。最近和一个朋友聊天,说他的一个开发人员已经工作了3年多了。一个需要的技术点是循环删除List中的元素。搞了半天,他说程序报错,他做不了。.他挺无语的,跟我吐槽,我说工作3年多就不行了,不行的话你去网上找找,他说确实是,这个开发难度很大,直接崩溃了!!循环删除List中的元素。这个问题需要注意。如果你是新手,会遇到一点小麻烦,但工作了3年多,我觉得不应该这样。好吧,栈长会来这里。整理它的方式。例如有如下List:publicListinitList=Arrays.asList("张三","李四","星期一","刘四","李强","李白");如何删除姓李的人名单?方法下面分析一个可行的方法!本文所有完整示例源码均已上传:https://github.com/javastacks...欢迎Star学习,这??里将提供以下Java示例!1.普通for循环删除(不靠谱)/***普通for循环删除*@author:栈长*@from:公众号Java技术栈*/@Testpublicvoidremove1(){Listlist=newArrayList(初始化列表);for(inti=0;ilist=newArrayList(initList);intsize=list.size();for(inti=0;i=list的实际大小,肯定是异常的。3.普通for循环倒序删除(靠谱)/***普通for循环倒序删除*@author:栈长*@from:公众号Java技术栈*/@Testpublicvoidremove3(){Listlist=newArrayList(initList);对于(inti=list.size()-1;i>0;i--){Stringstr=list.get(i);如果(str.startsWith("Lee")){list.remove(i);}}System.out.println(list);}输出结果:[张三,周一,刘四]结果输出正常,即使在这个删除方法里把list.size()放到变量里也OK,因为它在循环中只使用了一次。4.增强for循环删除(抛出异常)/***增强for循环删除*@author:栈长*@from:公众号Java技术栈*/@Testpublicvoidremove3(){Listlist=new数组列表(初始化列表);for(Stringelement:list){if(element.startsWith("Lee")){list.remove(element);}}System.out.println(list);}输出结果:好家伙,又抛出异常了。不过这次的异常和上面的下标异常不同。这次是:java.util.ConcurrentModificationException这是集合操作中非常常见的异常之一,也就是并发修改异常!实际上,for(xxinxx)是for循环的增强,即迭代器Iterator的增强实现。它在内部调用Iterator方法。为什么会报ConcurrentModificationException错误?我们看源码:当下一个元素被移除时,会判断要修改的数量(modCount)和期望修改的数量(expectedModCount)是否一致,如果不一致就会报错报错,ArrayList中的remove方法没有同步期望修改数量(expectedModCount)的值,所以会抛出异常。另外整理了最新最全的Java面试题,一共1800+,微信搜索Java面试库小程序在线刷题。5.迭代器循环iteratordelete(靠谱)/***迭代器循环删除(iterator.remove)*@author:栈长*@from:公众号Java技术栈*/@Testpublicvoidremove4(){Listlist=newArrayList(初始化列表);for(Iteratoriterator=list.iterator();iterator.hasNext();){Stringstr=iterator.next();if(str.contains("李")){iterator.remove();}}System.out.println(list);}输出结果:[张三,周一,刘四]结果输出正常,这是因为迭代器中的remove方法会期望修改数的值(expectedModCount)是同步的:所以,这种删除方法是安全的,推荐使用。6.迭代器循环集合删除(抛出异常)/***迭代器循环删除(list.remove)*@author:栈长度*@from:公众号Java技术栈*/@Testpublicvoidremove5(){Listlist=newArrayList(initList);for(Iteratoriterator=list.iterator();iterator.hasNext();){Stringstr=ite.next();if(str.contains("李")){list.remove(str);}}System.out.println(list);}输出结果:又一个并发修改异常。虽然这个例子使用了Iterator循环,但是在删除的时候使用了一个列表。remove方法也是有问题的,注意,别用错了。7.集合forEach方法循环删除(抛异常)/***list.forEachdelete*@author:stacklength*@from:公众号Java技术栈*/@Testpublicvoidremove6(){Listlist=新数组列表(初始化列表);list.forEach((e)->{if(e.contains("Lee")){list.remove(e);}});System.out.println(list);}输出结果:forEach源码:forEach方法背后其实是一个增强的for循环,底层是迭代器,所以使用list.remove也会抛出ConcurrentModificationException。8.Streamfilter过滤(靠谱)/***streamfilter过滤*@author:栈长*@from:公众号Java技术栈*/@Testpublicvoidremove7(){Listlist=newArrayList(initList);list=list.stream().filter(e->!e.startsWith("Lee")).collect(Collectors.toList());System.out.println(list);}输出结果:[sheetWednesday,Monday,LiuSi]Streamfilter的详细用法,栈长之前分享过:还在遍历搜索集合吗?放过我吧!Java8的一行代码真的很优雅!,如果你没看过,回去看看。该方法利用Stream的过滤功能,快速过滤需要的元素。虽然它不执行集合删除,但它达到了同样的目的。这种方法应该更简洁。本文所有完整示例源码均已上传:https://github.com/javastacks...欢迎Star学习,这??里将提供以下Java示例!总结本文总结了8种循环删除List元素的方法:普通for循环删除(不可靠)普通for循环提取变量删除(抛异常)普通for循环逆序删除(可靠)增强for循环删除(抛异常)iterator循环Iterator删除(靠谱)iterator循环集合删除(抛异常)setforEach方法循环删除(抛异常)streamfilter过滤(靠谱)可靠可行的方案只有3种,正统的删除方法只有2种,但也要小心不要用错方法,所以我也明白小伙子说无论如何也做不到,可能是走了很多弯路,或者是没有找到正确的方法。您还知道哪些其他删除技术?欢迎留言分享~好了,今天的分享就到这里了,稍后栈长会分享更多有趣的Java技术和最新的技术资料,关注公众号Java技术栈第一时间推送,我也会面试主流Java的问题和参考答案都整理出来了。在公众号后台回复关键词“面试”刷题。最后留个话题:如何去除List\中的重复元素?下一期分享,等栈长写完,公众号Java技术栈第一时间推送,别走开~版权声明:本文为公众号《Java》原创作品技术栈》,转载或引用本文内容请注明出处,抄袭、侵权、洗稿等投诉后果自负,并保留追究其法律责任的权利。近期热点文章推荐:1.1000+Java面试题及答案(2022最新版)2.厉害了!Java协程来了。..3.SpringBoot2.x教程,太全面了!4.不要用爆破爆满画面,试试装饰者模式,这才是优雅的方式!!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!