ArrayList在for循环中使用remove方法移除元素方法介绍

 更新时间:2017年09月30日 09:15:00   作者:性子有点污  
这篇文章主要介绍了ArrayList在for循环中使用remove方法移除元素的内容,介绍了具体代码实现,需要的朋友可以参考下。

有时候我们需要在一个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实例详解  等。感谢朋友们对脚本之家网站的支持。有什么问题或者想要了解的可以随时给我们留言,小编会及时回复大家的。

相关文章

  •  Spring 中 Bean 的生命周期详解

     Spring 中 Bean 的生命周期详解

    这篇文章主要介绍了Spring中Bean的生命周期详解,Java中的公共类称之为Bean或Java Bean,而Spring中的Bean指的是将对象的生命周期
    2022-09-09
  • Java原子类中的AtomicInteger类详解

    Java原子类中的AtomicInteger类详解

    这篇文章主要介绍了Java原子类中的AtomicInteger类详解,原子类可以保证对"变量"操作的,原子性、有序性、可见性,我们可以通过AtomicInteger类,来看看它们是怎样工作的,需要的朋友可以参考下
    2023-10-10
  • Springboot获取文件内容如何将MultipartFile转File

    Springboot获取文件内容如何将MultipartFile转File

    本文给大家介绍Springboot获取文件内容,将MultipartFile转File方法,本文结合示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2024-01-01
  • 剖析Fork join并发框架工作窃取算法

    剖析Fork join并发框架工作窃取算法

    这篇文章主要为大家剖析介绍了Fork join并发框架工作窃取算法的示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Java中的static和final关键字的使用详解

    Java中的static和final关键字的使用详解

    这篇文章主要介绍了Java中的static和final关键字的使用详解,  当方法名前有static,即为static方法,可以方便我们无需创建对象也可以调用此方法,静态方法比较拉,只可以访问 静态的 属性/变量/方法,无法访问非静态的这些属性/变量/方法,需要的朋友可以参考下
    2024-01-01
  • springboot项目中出现同名bean异常报错的解决方法

    springboot项目中出现同名bean异常报错的解决方法

    这篇文章给大家聊聊springboot项目出现同名bean异常报错如何修复,文中通过代码示例给大家介绍解决方法非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01
  • windows环境下java开发工具maven的安装教程图解

    windows环境下java开发工具maven的安装教程图解

    Maven是一个项目管理和综合工具。Maven提供了开发人员构建一个完整的生命周期框架。这篇文章主要介绍了windows环境下java开发工具maven的安装,非常不错对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot实现过滤敏感词的示例代码

    SpringBoot实现过滤敏感词的示例代码

    这篇文章主要为大家详细介绍了如何利用SpringBoot实现过滤敏感词功能,文中的示例代码讲解详细,感兴趣的小伙伴可以动手尝试一下
    2022-08-08
  • java天数计算函数(当前月天数、某月总天数及某月剩余天数)4种方法实现代码

    java天数计算函数(当前月天数、某月总天数及某月剩余天数)4种方法实现代码

    日常开发中会遇到关于日期的计算,比如当月的天数、两日期之间的天数、当月剩余天数等等,这篇文章主要给大家介绍了关于java天数计算函数(当前月天数、某月总天数及某月剩余天数)4种方法实现的相关资料,需要的朋友可以参考下
    2023-10-10
  • 详解Java解析XML的四种方法

    详解Java解析XML的四种方法

    本篇文章主要介绍了java解析XML的几种方式,XML现在已经成为一种通用的数据交换格式,给数据集成与交互提供了方便,有需要的可以了解一下。
    2016-11-11

最新评论