当前位置:首页 > 科技  > 软件

五年程序员使用ArrayList居然用forEach遍历删除元素?

来源: 责编: 时间:2024-01-08 09:16:58 278观看
导读哈喽,大家好,我是了不起。通常1-3年工作经验的程序员算是初级程序员,再往后基本上就是在编程领域有了一定经验的高级程序员了。但是最近公司代码review时,我居然发现一个 5 年工作经验的程序员,使用 ArrayList 居然用 forE

哈喽,大家好,我是了不起。SKF28资讯网——每日最新资讯28at.com

通常1-3年工作经验的程序员算是初级程序员,再往后基本上就是在编程领域有了一定经验的高级程序员了。SKF28资讯网——每日最新资讯28at.com

但是最近公司代码review时,我居然发现一个 5 年工作经验的程序员,使用 ArrayList 居然用 forEach 遍历删除元素?SKF28资讯网——每日最新资讯28at.com

1、现场还原

由于公司代码有一定敏感,我这里把代码进行脱敏,大家一起来看看:SKF28资讯网——每日最新资讯28at.com

public static void main(String[] args) {    ArrayList<String> list = new ArrayList<>(Arrays.asList("1", "2", "3"));    list.forEach(item -> {        if (item.startsWith("1")) {            list.remove(item);        }    });}

乍看之下,这段代码似乎没什么问题。但实际运行时,它会抛出ConcurrentModificationException异常。SKF28资讯网——每日最新资讯28at.com

这是为什么呢?我们运行这段代码,报错如下 :SKF28资讯网——每日最新资讯28at.com

图片图片SKF28资讯网——每日最新资讯28at.com

2、原因分析

其实 forEach 是一个语法糖,我们编译后的代码如下:SKF28资讯网——每日最新资讯28at.com

//这是一颗语法糖,编译后相当于:for(Iterator i = lists.iterator();i.hasNext();){    String s = (String)i.next();    if(s.startsWith("1")){        list.remove(s);    }}

然后这里的 i.next() 方法:SKF28资讯网——每日最新资讯28at.com

public E next() {    checkForComodification();    int i = cursor;    if (i >= size)        throw new NoSuchElementException();    Object[] elementData = ArrayList.this.elementData;    if (i >= elementData.length)        throw new ConcurrentModificationException();    cursor = i + 1;    return (E) elementData[lastRet = i];}final void checkForComodification() {    if (modCount != expectedModCount)       throw new ConcurrentModificationException();}

这样就很明了了,在Java中,当我们试图在遍历一个集合的同时修改它时,就会遇到ConcurrentModificationException。这是因为ArrayList的迭代器设计为快速失败(fail-fast),即在检测到集合在迭代期间被修改时立即抛出异常。SKF28资讯网——每日最新资讯28at.com

3、如何正确删除?

3.1 使用迭代器的remove方法

Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {    String item = iterator.next();    if (item.startsWith("1")) {        iterator.remove();    }}

这种方法可以保证在删除元素的同时不会破坏迭代器的状态。SKF28资讯网——每日最新资讯28at.com

3.2 使用removeIf方法

从Java 8开始,ArrayList引入了removeIf方法,这是删除元素的另一种便捷方式:SKF28资讯网——每日最新资讯28at.com

list.removeIf(item -> item.startsWith("1"));

3.3 收集需要删除的元素

最后一种方法是首先收集所有需要删除的元素,然后再进行删除:SKF28资讯网——每日最新资讯28at.com

List<String> itemsToRemove = list.stream()    .filter(item -> item.startsWith("1"))    .collect(Collectors.toList());list.removeAll(itemsToRemove);

本文链接:http://www.28at.com/showinfo-26-57900-0.html五年程序员使用ArrayList居然用forEach遍历删除元素?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 推荐一个13k的微服务编排引擎Netflix Conductor

下一篇: 20 个让用户惊叹不已的按钮效果

标签:
  • 热门焦点
  • 对标苹果的灵动岛 华为带来实况窗功能

    继苹果的灵动岛之后,华为也在今天正式推出了“实况窗”功能。据今天鸿蒙OS 4.0的现场演示显示,华为的实况窗可以更高效的展现出实时通知,比如锁屏上就能看到外卖、打车、银行
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • 学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 东方甄选单飞:有些鸟注定是关不住的

    作者:彭宽鸿来源:华尔街科技眼&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;&zwj;东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一
  • 四年持续更迭坚持探索行业无人之境,HarmonyOS 4带来五大升级多项创新

    除了华为每年新发布的旗舰手机系列,上亿花粉更加期待鸿蒙系统每次的跨版本大更新。8月4日,HarmonyOS 4于HDC 2023正式发布,这也是该系统历经四年的再
  • Windows 11发布,微软一改往常对老机型开放的态度

    距离 Windows 11 发布已经过去一周,在过去一周里,很多数码爱好者围绕其对 Android 应用的支持、对老机型的升级问题展开了激烈讨论。与以往不同的是,在这次大
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top