最新要闻
- 7斤纯铜就能压制酷睿i9 为啥还要散热风扇?原因一个字:贵
- 新能源起大早赶晚集 吉利失去的四年
- 全球新消息丨魔兽等游戏国服已停服两周 暴雪高管:寻求替代方式服务中国玩家
- 全球热点评!法拉利2022年销量破纪录 员工年终奖人均10万
- 焦点信息:官方加紧备货!红魔8 Pro系列开售一个多月供不应求:网友反映“秒没”
- 全球要闻:2.5K触屏骁龙本!小米Book 12.4二合一首销:到手2899元
- 环球微动态丨2023年来最强雨雪上线:北方下雪、南方暴雨 影响超20省份
- 单踏板不爽、刹车失灵无妨!特斯拉83%车主为新用户 客户流失低忠诚度最高
- 【环球速看料】聊天机器人ChatGPT要抢搜索引擎生意 谷歌出手:竞品Bard来了
- 【天天新要闻】安卓之光来了!曝小米13 Ultra 4月登场:支持120倍变焦
- 天天时讯:售价超过2万元 苹果MR头显即将推出:搭载全新OS 未来将取代iPhone
- 【天天新视野】我国多地取消中考男女生长跑 800米对健康不利:专家喊话体育锻炼不能放松
- 当前快报:做出《新闻联播》片头的齐东旭教授走了:中国CAD与计算机图形学痛失巨匠
- 环球观焦点:游客放孔明灯被拽下吹灭 景区回应:明文规定禁放禁售
- 打价格战底气十足:数据显示特斯拉单车利润是比亚迪6倍
- 梦回Win98!196MB内存电脑成功启动Win11:开机时间要30分钟
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。
大家好,我是栈长。
最近和某个朋友聊天,说他手下的一个开发,工作 3 年多了,一个需求的技术点,需要循环删除 List 中的元素,整了半天,说程序报错,不会弄。。
他挺无语的,和我倾诉,我说工作 3 年多也不至于吧,不会的话,在网上找找也能搞定啊,他说确实是的,这个开发挺难带的,简直崩溃!!
(资料图片)
循环删除 List 中的元素,这个问题是有需要的注意点的,如果是个新手,确实会遇到一点麻烦,但工作 3 年多,我觉得应该不至于啊,好吧,这篇栈长就来梳理一下这其中的道道。
问题
比如有以下这个 List:
public List initList = Arrays.asList("张三", "李四", "周一", "刘四", "李强", "李白");
怎么删除 List 中姓李的人?
方法
我来们分析下有可行的方法!
本文所有完整示例源代码已经上传:
https://github.com/javastacks/javastack
欢迎 Star 学习,后面 Java 示例都会在这上面提供!
1、普通 for 循环删除(不可靠)
/** * 普通 for 循环删除 * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void remove1() { List list = new ArrayList(initList); for (int i = 0; i < list.size(); i++) { String str = list.get(i); if (str.startsWith("李")) { list.remove(i); } } System.out.println(list);}
输出结果:
[张三, 周一, 刘四, 李白]
WC,李白没删干净?
问题就出在 list.size(),因为 list.size() 和 i 都是动态变化的,i 的值一直在累加,list.size() 一直在减少,所以 list 就会早早结束了循环。
所以这种方式虽然不会报错,但存在隐患,并且不容易被察觉,不建议使用。
2、普通 for 循环提取变量删除(抛异常)
把上面的示例中的 size 提出变量:
/** * 普通 for 循环删除(size提出变量) * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void remove2() { List list = new ArrayList(initList); int size = list.size(); for (int i = 0; i < size; i++) { String str = list.get(i); if (str.startsWith("李")) { list.remove(i); } } System.out.println(list);}
输出结果:
好家伙,都直接干下标溢出异常了。。
这里也很明显,因为 size 变量是固定的,但 list 的实际大小是不断减小的,而 i 的大小是不断累加的,一旦 i >= list 的实际大小肯定就异常了。
3、普通 for 循环倒序删除(可靠)
/** * 普通 for 循环倒序删除 * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void remove3() { List list = new ArrayList(initList); for (int i = list.size() - 1; i > 0; i--) { String str = list.get(i); if (str.startsWith("李")) { list.remove(i); } } System.out.println(list);}
输出结果:
[张三, 周一, 刘四]
结果输出正常,这种删除方式就算把 list.size() 提出变量也是 OK 的,因为循环中只用到了一次。
4、增强 for 循环删除(抛异常)
/** * 增强 for 循环删除 * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void remove3() { List list = new ArrayList(initList); for (String element : list) { if (element.startsWith("李")) { list.remove(element); } } System.out.println(list);}
输出结果:
好家伙,又抛异常了。不过这次的异常和上面的下标异常不太一样,这次是:
java.util.ConcurrentModificationException
这个是集合操作中很常见的异常之一,即并发修改异常!
其实,for(xx in xx) 就是增强的 for循环,即迭代器 Iterator 的加强实现,其内部是调用的 Iterator 的方法,为什么会报 ConcurrentModificationException 错误,我们来看下源码:
取下个元素的时候都会去判断要修改的数量(modCount)和期待修改的数量(expectedModCount)是否一致,不一致则会报错,而 ArrayList 中的 remove 方法并没有同步期待修改的数量(expectedModCount)值,所以会抛异常了。
另外,最新最全的 Java 面试题整理好了,共 1800+,微信搜索Java面试库小程序在线刷题。
5、迭代器循环迭代器删除(可靠)
/** * 迭代器循环删除(iterator.remove) * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void remove4() { List list = new ArrayList(initList); for (Iterator iterator = list.iterator(); iterator.hasNext(); ) { String str = iterator.next(); if (str.contains("李")) { iterator.remove(); } } System.out.println(list);}
输出结果:
[张三, 周一, 刘四]
结果输出正常,这是因为迭代器中的 remove 方法将期待修改的数量(expectedModCount)值进行了同步:
所以,这种删除方法是安全的,推荐使用。
6、迭代器循环集合删除(抛异常)
/** * 迭代器循环删除(list.remove) * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void remove5() { List list = new ArrayList(initList); for (Iterator ite = list.iterator(); ite.hasNext(); ) { String str = ite.next(); if (str.contains("李")) { list.remove(str); } } System.out.println(list);}
输出结果:
又是那个并发修改异常,这个示例虽然使用了 Iterator 循环,但删除的时候却使用了 list.remove 方法,同样是有问题的,注意了,千万别用错了。
7、集合 forEach 方法循环删除(抛异常)
/** * list.forEach 删除 * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void remove6() { List list = new ArrayList(initList); list.forEach((e) -> { if (e.contains("李")) { list.remove(e); } }); System.out.println(list);}
输出结果:
forEach 源码:
forEach 方法的背后其实就是增强的 for 循环,底层即迭代器,所以使用 list.remove 同样抛出 ConcurrentModificationException
异常。
8、stream filter 过滤(可靠)
/** * stream filter 过滤 * @author: 栈长 * @from: 公众号Java技术栈 */@Testpublic void remove7() { List list = new ArrayList(initList); list = list.stream().filter(e -> !e.startsWith("李")).collect(Collectors.toList()); System.out.println(list);}
输出结果:
[张三, 周一, 刘四]
Stream filter 的详细用法,栈长之前已经分享过:你还在遍历搜索集合?别逗了!Java 8 一行代码搞定,是真的优雅!,没看过的点回去看看吧。
这个方法即是利用了 Stream 的筛选功能,快速过滤所需要的元素,虽然不是进行集合删除,但达到了同样的目的,这种方法要更简洁吧。
本文所有完整示例源代码已经上传:
https://github.com/javastacks/javastack
欢迎 Star 学习,后面 Java 示例都会在这上面提供!
总结
本文总结了 8 种循环删除 List 元素的方法:
- 普通 for 循环删除(不可靠)
- 普通 for 循环提取变量删除(抛异常)
- 普通 for 循环倒序删除(可靠)
- 增强 for 循环删除(抛异常)
- 迭代器循环迭代器删除(可靠)
- 迭代器循环集合删除(抛异常)
- 集合 forEach 方法循环删除(抛异常)
- stream filter 过滤(可靠)
可靠、可行的方案也只有 3 种,正统的删除法也就 2 种,但也要注意别用错了方法,所以也理解那个小伙子说怎么搞都搞不定,估计也是走了不少弯路,或者没有找对方法吧。
你还知道哪些删除技巧?欢迎留言分享~
好了,今天的分享就到这里了,后面栈长会分享更多好玩的 Java 技术和最新的技术资讯,关注公众号Java技术栈第一时间推送,我也将主流 Java 面试题和参考答案都整理好了,在公众号后台回复关键字 "面试" 进行刷题。
最后,留个话题:
怎么去除 List
中的重复元素呢?
下期分享,等栈长写完,公众号Java技术栈第一时间推送,不要走开~
版权声明:本文系公众号 "Java技术栈" 原创,转载、引用本文内容请注明出处,抄袭、洗稿一律投诉侵权,后果自负,并保留追究其法律责任的权利。
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!
带了一个 3 年的开发,不会循环删除 List 中的元素,心态崩了。。
环球通讯!DataX插件二次开发指南
7斤纯铜就能压制酷睿i9 为啥还要散热风扇?原因一个字:贵
新能源起大早赶晚集 吉利失去的四年
全球新消息丨魔兽等游戏国服已停服两周 暴雪高管:寻求替代方式服务中国玩家
全球热点评!法拉利2022年销量破纪录 员工年终奖人均10万
世界新动态:读Java实战(第二版)笔记03_引入和使用流
焦点快看:必知必会的设计原则——开放封闭原则
焦点信息:官方加紧备货!红魔8 Pro系列开售一个多月供不应求:网友反映“秒没”
全球要闻:2.5K触屏骁龙本!小米Book 12.4二合一首销:到手2899元
环球微动态丨2023年来最强雨雪上线:北方下雪、南方暴雨 影响超20省份
单踏板不爽、刹车失灵无妨!特斯拉83%车主为新用户 客户流失低忠诚度最高
【环球速看料】聊天机器人ChatGPT要抢搜索引擎生意 谷歌出手:竞品Bard来了
【天天新要闻】安卓之光来了!曝小米13 Ultra 4月登场:支持120倍变焦
天天时讯:售价超过2万元 苹果MR头显即将推出:搭载全新OS 未来将取代iPhone
【天天新视野】我国多地取消中考男女生长跑 800米对健康不利:专家喊话体育锻炼不能放松
关于pacemaker-Cluster-节点的维护模式的功能介绍
SpringBoot怎么自定义一个Starter
当前快报:做出《新闻联播》片头的齐东旭教授走了:中国CAD与计算机图形学痛失巨匠
环球观焦点:游客放孔明灯被拽下吹灭 景区回应:明文规定禁放禁售
【天天新视野】《分布式技术原理与算法解析》学习笔记Day03
Spring IOC官方文档学习笔记(九)之基于注解的容器配置
每个程序员必学的10个Git命令
打价格战底气十足:数据显示特斯拉单车利润是比亚迪6倍
梦回Win98!196MB内存电脑成功启动Win11:开机时间要30分钟
环球看热讯:node中的优先从缓存中加载模块与模块的加载规则
LeetCode 239 滑动窗口最大值- Python手撕最大堆
环球新资讯:vscode编译java程序出现NoSuchMethodError的解决方法
价格又卷下来了!致态TiPlus 7100固态硬盘新史低:1TB仅589元
【天天快播报】澳大利亚一架波音737灭火飞机坠毁:全员奇迹生还
[JavaScript]实例化对象
天天热消息:【ctf权威竞赛指南笔记】(1)CTF
环球聚焦:全国城市地级市区县sql
速递!官宣续航为什么跑不到?爱玛实测电动车续航最多缩水40%
地震威力巨大 土耳其世界文化遗产古堡地震中倒塌
快资讯丨拒绝妖魔化 硬件发烧友怒买N张矿卡实测:结果大受震撼
【世界聚看点】上海一男子骑电车被劳斯莱斯撞倒后笑出了声 网友:还是大城市机会多
世界速看:Intel中国特供版i5-13490F突然开卖:1599元性价比逆天
厦门海辰储能--内部推荐
全球动态:Obsidian 插件(二):Advanced_Slides 的使用
自制肥牛卷
【快播报】【持续更新中】开源贡献记录
全球即时:USACO 2023 January Contest, Bronze Problem 3. Moo Operations
每日简讯:还有五场!饿了么免单活动又来了 一文看懂免单攻略
环球快资讯丨官方:嫦娥六号将带回2000克月球样品、嫦娥八号集大成
一天2次!土耳其再发7.8级地震:强震群 形势严峻
焦点信息:微博发布春节档电影热度报告:山东、河南网友最爱《满江红》
观点:真超薄自适应贴合!冈本超薄避孕套20片到手39.9元
世界短讯!现代农业|AIRIOT智慧农业管理解决方案
天天百事通!Ansible的部署和命令模块
携手Hello Kitty:小米Civi 2情人节特别版明日亮相
【全球快播报】国外网友:不看好网飞版《三体》 感谢腾讯!
全球通讯!10块钱可测17次!奥德中科快速检测试剂盒大促:0.59元/份清仓
世界视点!《流浪地球》引力弹弓人类真的实现过!张朝阳在线手算木星之旅
热点评!2022欧洲最畅销车型榜:国人不爱买的法系车登顶
当前快看:记录--使用Lunchbox 在 vue3 中创建一个 3D 地球
环球看点!做一个“不那么差”的程序员,有多难?
自研国产客机梦碎 消息称日本终止SpaceJet飞机 曾比我国进展都快
每日播报!8999元 科大讯飞推出T20 Pro学习机:2.5K屏、12000mAh大电池
全球微资讯!又又又融资1.35亿美元!贾跃亭喊话:FF 91将交付 百万豪车你买吗?
5499元 爱玛指挥官2023两轮电动车发布:石墨烯电池 145km长续航
《零:月蚀的假面》数字豪华版服装公布:旗袍黑丝超吸睛
天天报道:【交互式用户流程与演示设计】上海道宁与Overflow让您能更自信的展示您的设计
Helm
2023年Java面试正确姿势(1000+面试题附答案解析)
天天最新:黄光裕频繁减持国美套现10亿 把控股股东席位“减”没了
小屏幕拜拜!新款比亚迪秦PLUS DM-i内饰官图:最大短板被补足
【焦点热闻】可装进口袋!大疆新品DJI Mini 2 SE无人机2月9日发布
【全球播资讯】抛弃ARM公版 高通纯自研CPU骁龙8cx Gen4曝光:12核3.4GHz性能怪兽
焦点热讯:林志颖车祸后首谈特斯拉:称自己还在开特斯拉 没有任何阴影
天天速看:统信 UOS 重置Root账号密码 获取 Root 权限
全球快资讯:Spring:声明式事务
每日热点:Docker-harbor私有仓库
世界动态:爱奇艺用户吐槽会员跳不过广告!客服称登陆设备太多 账号异常
快播:6人网订民宿遇坐地起价:店家称有20多人订此房间 谁加价谁住
环球今日讯!索尼PS5不香了!会员数量持续流失 微软迎头赶上
10大“刮油”食物 佳节必备 转给需要的朋友!
环球视点!《流浪地球2》太空电梯能实现吗?专家:实现难度极大
全球信息:【秒杀】NTP时钟同步让秒杀成毫秒微秒纳秒杀
全球热议:满血40Gbps USB4 铭凡锐龙7000 8核准系统2549元(液金散热)
中国用户立大功!库克称iPhone很多技术灵感来自中国
广汽菲克破产 4S店已无售后!官方:我们为车主兜底
研究称调整脑电波能加速成人学习速度:至少快3倍
吾爱破解 2023 春节解题领红包之 Web 题解
开源即时通讯IM框架 MobileIMSDK v6.3 发布
MySQL执行流程
Python工具箱系列(二十四)
比眼镜蛇还毒50倍!女子买到蓝环章鱼险食用 反复辨认后扔了
信息:让ChatGPT写一篇《比亚迪能否打败特斯拉》的评论文章
Intel中国特供新神U i5-13490F首曝:频率更高、缓存更大
当前最新:(笔记)【NTP系列:06】NTP时间同步配置总结:Windows(W32Time)作为NTP时钟源服务端,Linux作为客户端
java注解与反射详解
世界快看点丨ChatGPT可能的影响与机会
当前短讯!面试官:实现异步的20种方式,你知道几个?
比亚迪海鸥实车现身 网友:买早了 8万元绝对卖爆
打破Steam Deck 12周霸榜!《霍格沃茨之遗》登顶Steam周销榜
今日精选:老人无证驾驶无牌三轮车逆行被撞还被罚 网友:建议全国推广
【世界快播报】专家称成年人有权做个废物!网友:反而更激励了我
天天亮点!00后平均期望薪资超7K 月薪高于一切:曾被痛批不应为钱选择工作
天天微头条丨drools规则动态化实践