有时候我们需要在一个ArrayList的for循环中动态删除元素的需求, 废话不多说看代码
List<Integer> list = new ArrayList<Integer>();
list.add(0);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
//正常循环
for (int i = 0; i < list.size(); i++) {
System.out.println("i的值:" + i + " 对应的数字:" + list.get(i));
}
System.out.println("没有remove前list的项:"+list.size());
//边循环边删除
for (int i = 0; i < list.size(); i++) {
System.out.println("i的值:" + i + " 对应的数字:" + list.get(i));
if(list.get(i) == 3) list.remove(list.get(i));//删除list的第四项
}
System.out.println("remove后list的项:"+list.size());
System.out.println("==========remove后的list==========");
for (int i = 0; i < list.size(); i++) {
System.out.println("i的值:" + i + " 对应的数字:" + list.get(i));
}
执行代码, 结果如下:
i的值:0 对应的数字:0 i的值:1 对应的数字:1 i的值:2 对应的数字:2 i的值:3 对应的数字:3 i的值:4 对应的数字:4 i的值:5 对应的数字:5 i的值:6 对应的数字:6 i的值:7 对应的数字:7 没有remove前list的项:8 i的值:0 对应的数字:0 i的值:1 对应的数字:1 i的值:2 对应的数字:2 i的值:3 对应的数字:3 i的值:4 对应的数字:5 i的值:5 对应的数字:6 i的值:6 对应的数字:7 remove后list的项:7 ==========remove后的list========== i的值:0 对应的数字:0 i的值:1 对应的数字:1 i的值:2 对应的数字:2 i的值:3 对应的数字:4 i的值:4 对应的数字:5 i的值:5 对应的数字:6 i的值:6 对应的数字:7
可以看到没有删除前, 我们的list的项和循环对应的数字都是正确的, 但是下面的循环在删除第4个元素后,第4,5,6个项对应的数字本应该是4,5,6, 但是这里却变成了5,6,7.
原因是,我们删除第4项后,list的长度就变成7,而且,list会把第4项后面的值往前移一位, 也就是说,i=3时,list.get(i)=4,i=4时,list.get(i)=5,i=5时,list.get(i)=6,i=6时,list.get(i)=7.. 我们再说的形象一点, 就是本来有8层糕点,依次是0-7,竖起来,大的在上,小的在下,我们从下往上数,数到第5个的时候,吃掉这一层糕点,这时,上面三层分别往下移了一层
所以, 值为4的项我们根本没有循环到
那有什么方法可以实现remove呢, 有个笨方法,是新建一个tempList, 把要删除的项全部add进去,最后用list.removeAll(tempList)实现 . 但是这里我们有更好的方法, 就是倒序删除
还是上面的例子, 我们看代码:
List<Integer> list = new ArrayList<Integer>();
list.add(0);
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
//正常循环
for (int i = 0; i < list.size(); i++) {
System.out.println("i的值:" + i + " 对应的数字:" + list.get(i));
}
System.out.println("没有remove前list的项:"+list.size());
//边循环边删除
for (int i = list.size() -1 ; i >= 0; i--) {
System.out.println("i的值 " + i + " 对应的数字 " + list.get(i));
if(list.get(i) == 3) list.remove(list.get(i));
}
System.out.println("remove后list的项:"+list.size());
System.out.println("==========remove后的list==========");
for (int i = 0; i < list.size(); i++) {
System.out.println("i的值 " + i + " 对应的数字 " + list.get(i));
}
执行代码,结果如下:
i的值:0 对应的数字:0 i的值:1 对应的数字:1 i的值:2 对应的数字:2 i的值:3 对应的数字:3 i的值:4 对应的数字:4 i的值:5 对应的数字:5 i的值:6 对应的数字:6 i的值:7 对应的数字:7 没有remove前list的项:8 i的值 7 对应的数字 7 i的值 6 对应的数字 6 i的值 5 对应的数字 5 i的值 4 对应的数字 4 i的值 3 对应的数字 3 i的值 2 对应的数字 2 i的值 1 对应的数字 1 i的值 0 对应的数字 0 remove后list的项:7 ==========remove后的list========== i的值 0 对应的数字 0 i的值 1 对应的数字 1 i的值 2 对应的数字 2 i的值 3 对应的数字 4 i的值 4 对应的数字 5 i的值 5 对应的数字 6 i的值 6 对应的数字 7
我们可以看到变循环变删除,并不影响后面的元素, remove后的list也和第一次的结果是一样的 . 这是因为我们删除list元素,list的长度是会变小, 但是变化的只是比当前被删除元素的项大的项, 而我们这里使用倒序循环, 大的项, 我们已经执行过了, 所以不会影响.. 再用上面的比喻来说明,这次我们是从上往下数,数到第4个的时候,吃掉这一层糕点,这时,上面三层分别往下移了一层 , 但是这不影响我们之前数过的蛋糕, 而且对下面的蛋糕也不影响, 这就是原理
总结
以上就是本文关于ArrayList在for循环中使用remove方法移除元素方法介绍的全部内容,希望对大家有所帮助。感兴趣的朋友可以参阅:Java实现跳跃表(skiplist)的简单实例 Java多线程ForkJoinPool实例详解 等。感谢朋友们对网站的支持。有什么问题或者想要了解的可以随时给我们留言,小编会及时回复大家的。
# java
# for循环
# remove
# arraylist
# Java8 List集合如何移除满足条件的元素
# Java List移除相应元素的超简洁写法分享
# java中List移除元素的四种方式
# java中LinkedList使用迭代器优化移除批量元素原理
# Java list移除元素相关操作指南
# 往下
# 这一
# 可以看到
# 到第
# 都是
# 有什么
# 也不
# 有个
# 过了
# 这就是
# 给我们
# 是从
# 感兴趣
# 朋友们
# 可以实现
# 会把
# 再用
# 多说
# 在上
# 这是因为
相关文章:
建站之星手机一键生成:多端自适应+小程序开发快速建站指南
微信小程序 input输入框控件详解及实例(多种示例)
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
建站主机选哪家性价比最高?
如何用腾讯建站主机快速创建免费网站?
南平网站制作公司,2025年南平市事业单位报名时间?
如何快速搭建高效服务器建站系统?
贸易公司网站制作流程,出口贸易网站设计怎么做?
网站制作壁纸教程视频,电脑壁纸网站?
制作电商网页,电商供应链怎么做?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
广州网站建站公司选择指南:建站流程与SEO优化关键词解析
制作网站的软件免费下载,免费制作app哪个平台好?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
如何批量查询域名的建站时间记录?
php8.4新语法match怎么用_php8.4match表达式替代switch【方法】
淘宝制作网站有哪些,淘宝网官网主页?
已有域名如何快速搭建专属网站?
建站主机系统SEO优化与智能配置核心关键词操作指南
公司门户网站制作流程,华为官网怎么做?
如何在七牛云存储上搭建网站并设置自定义域名?
如何通过cPanel快速搭建网站?
建站之星如何修改网站生成路径?
婚礼视频制作网站,学习*后期制作的网站有哪些?
如何解决VPS建站LNMP环境配置常见问题?
如何快速搭建高效香港服务器网站?
h5网站制作工具有哪些,h5页面制作工具有哪些?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
简单实现Android验证码
如何挑选优质建站一级代理提升网站排名?
网站按钮制作软件,如何实现网页中按钮的自动点击?
如何选择可靠的免备案建站服务器?
深圳企业网站制作设计,在深圳如何网上全流程注册公司?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
如何快速搭建虚拟主机网站?新手必看指南
如何在服务器上配置二级域名建站?
如何在IIS中新建站点并解决端口绑定冲突?
广州美橙建站如何快速搭建多端合一网站?
网站制作话术技巧,网站推广做的好怎么话术?
建站之星如何实现网站加密操作?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
建站之星3.0如何解决常见操作问题?
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
建站VPS配置与SEO优化指南:关键词排名提升策略
电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
如何生成腾讯云建站专用兑换码?
*请认真填写需求信息,我们会在24小时内与您取得联系。