java中for循环删除集合陷阱

 更新时间:2015年05月10日 10:37:37   投稿:hebedich  
java中在增强for循环为什么不能增删集合呢?一个循环迭代,跟集合的增删改没什么关系。修改集合不是for去做的。for只管循环迭代,你在循环里边修改集合,改变集合的长度,顺序对循环都有影响

首先看下面的代码:

import java.util.LinkedList;
import java.util.List;

public class DeleteCollection {
  
  public static void main(String[] args) {
    List<String> list = new LinkedList<String>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    for(int i=0;i<list.size();i++){ //循环删除集合中的元素
      list.remove(i);
    }
    System.out.println("还剩余的元素个数:"+list.size());
  }
}

上述的代码按照思路应该是对的,输出的结果也应该是0

看下面实际输出的结果:

还剩余的元素个数:2

你也许会问为什么呢?因为集合的大小是动态变化的,当你删除一个元素之后,元素中的序号又重新排列,原来第二个应该删除的元素现在排在了第一个元素的位置,真正删除的却是第三个元素,依次类推,删除的是第一个、第三个、第五个、、、、如果在原来删除的代码中加入语句:System.out.println("即将删除的元素:"+list.get(i));即可验证。

加入上述语句后输出的结果:

即将删除的元素:a
即将删除的元素:c
即将删除的元素:e
还剩余的元素个数:2

解决办法:

究其原因是因为你要删除的元素往前面移动了,而你的i保存的值依旧往后走,所以如果让i不往后走,往前走一个,即可删除本来排在第二个位置的元素现在排在了第一个位置上的元素。

更改后的核心代码:

  for(int i=0;i<list.size();i++){
      System.out.println("即将删除的元素:"+list.get(i));
      list.remove(i);
      i--;
    }

结果:

即将删除的元素:a
即将删除的元素:b
即将删除的元素:c
即将删除的元素:d
即将删除的元素:e
还剩余的元素个数:0

以上所述就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • JAVA调用JavaScript方法代码示例

    JAVA调用JavaScript方法代码示例

    之前在一次机缘巧合的情况下,需要时用JAVA执行js方法,查阅了一些文档,找到了相关解决方法,这里和大家分享一下,这篇文章主要给大家介绍了关于JAVA调用JavaScript方法的相关资料,需要的朋友可以参考下
    2023-09-09
  • java学习之JVM运行时常量池理解

    java学习之JVM运行时常量池理解

    这篇文章主要介绍了java学习之JVM运行时常量池理解,对常量池的好处以及基本类型的包装类常量池等作了简要分析,有需要的朋友可以借鉴参考下
    2021-09-09
  • springboot整合mybatis-plus逆向工程的实现

    springboot整合mybatis-plus逆向工程的实现

    这篇文章主要介绍了springboot整合mybatis-plus逆向工程的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • java封装及四种权限修饰符详解

    java封装及四种权限修饰符详解

    这篇文章主要介绍了java封装及四种权限修饰符详解,对属性进行封装,使用户不能直接输入数据,我们需要避免用户再使用"对象.属性"的方式对属性进行赋值
    2022-08-08
  • SpringCloud Zuul在何种情况下使用Hystrix及问题小结

    SpringCloud Zuul在何种情况下使用Hystrix及问题小结

    这篇文章主要介绍了SpringCloud Zuul在何种情况下使用Hystrix 及问题小结,感兴趣的朋友跟随小编一起看看吧
    2018-11-11
  • springboot:接收date类型的参数方式

    springboot:接收date类型的参数方式

    这篇文章主要介绍了springboot:接收date类型的参数方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • java多线程开启的三种方式你知道吗

    java多线程开启的三种方式你知道吗

    这篇文章主要为大家详细介绍了java多线程开启的三种方式,使用数据库,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下<BR>
    2022-02-02
  • springboot+jsonp解决前端跨域问题小结

    springboot+jsonp解决前端跨域问题小结

    这篇文章主要介绍了springboot+jsonp解决前端跨域问题小结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Spring Shell打Jar包时常用小技巧

    Spring Shell打Jar包时常用小技巧

    这篇文章主要介绍了Spring Shell打Jar包时常用小技巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • java中继承测试代码分析

    java中继承测试代码分析

    这篇文章主要介绍了java中继承测试代码分析,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12

最新评论