普通for循环遍历List时调用remove方法,List没有遍历完。为啥?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了普通for循环遍历List时调用remove方法,List没有遍历完。为啥?相关的知识,希望对你有一定的参考价值。

当我们用普通for循环时会这样写for(int i=0;i<list.size();i++),在循环体内使用list.remove(object)方法时,list.size()是会跟着改变的,但是i却没有变。所以list根本没有遍历完,甚至有可以报空指针异常。

list集合有个特点,比如说一个list里面有三个元素a,b,c,对应的索引分别是0,1,2。当调用remove(0)时,list会移除a这个元素,这个时候list里面的元素就变成b,c,对应的索引值分别为0,1。这个时候list的size已经变成了2,但是如楼主的for循环的话,循环的上限还是最开始的list的size值,也就是3。如此下去每移除一个元素的时候,list的索引取值范围都会变小,最后如果remove(i)中i的值超出了当前集合的范围了,就会报异常 参考技术A 是这样子的,你这种写法,应该不会报空指针。原因很简单,for(int i=0;i<list.size();i++)list.remove(i),list.size(),每次循环都会执行,所以不会报空的,但是由于删除后,list大小减小,而i++,每次都会执行,所以可能遍历不完~建议如果你要是删除整个list,可以使用 list.clear();方法。

如果是遍历删除,一般选择迭代器删除的
参考技术B 1.可以使用 snychronized 同步关键字 前提是 对象 list 也在 该类内

synchronized(this)
for(int i=0; i<list.size(); i++)
.......
list.remove(object);
.....................


表示 在被访问该段代码时 本类 不允许被其他对象 访问

2.对list 进行 重新包装 对list 对象 进行同步

说白了 就是 同步的问题
参考技术C 你的意思是不是这样:
j[]=0;
for(;;i++)

j[i]= list[i];
list.remove(x);

如果是这样的话;原因很简单,调用remove方法的时候是原来的实例list内容发生了改变,所以就会产生遍历不完的情况。
如果你的目的是不断筛选掉已经找到的list里面的值
可以让list自循环
类似于这样
while(list.contains(s))

list.remove(s);

k=list;//筛选后的list;
参考技术D 建议倒序循环删除
i<list.size();每次循环都会获得一次大小
然而你的i是每次都加的,list大小变动了,中间就有漏掉的

集合框架之三种迭代的能否删除

一:普通for循环的删除

1 // 普通for循环,通过索引删除,删除后索引要--
2         for (int i = 0; i < list.size(); i++) {
3             if ("d".equals(list.get(i))) {
4                 list.remove(i--);
5             }
6         }
7         System.out.println(list);

二:迭代器两种遍历(删除)方式

  方式一:

 

1 // 迭代器删除,不能用集合的删除方法,因为迭代过程中修改会发生并发修改异常
2         ListIterator<String> iter = list.listIterator();
3         while (iter.hasNext()) {
4             if ("d".equals(iter.next())) {
5                 iter.remove();
6             }
7         }
8         System.out.println(list);

 

  方式二:

1      for(ListIterator<String> iter=list.listIterator();iter.hasNext();){
2             if("d".equals(iter.next())){
3                 iter.remove();
4             }
5         }
6         System.out.println(list);

三:增强fore循环删除

// 增强for循环底层依赖迭代器,不能删除,只能遍历;删除会出现并发修改异常( java.util.ConcurrentModificationException)
        for (String string : list) {
            list.remove(string);//这是错误的代码
        }
        System.out.println(list);

 

以上是关于普通for循环遍历List时调用remove方法,List没有遍历完。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

List的remove()方法详解

如何正确遍历删除List中的元素(普通for循环增强for循环迭代器iteratorremoveIf+方法引用)

遍历list进行remove操作异常

集合框架之三种迭代的能否删除

for循环里面不要进行remove操作,for循环里remove元素后,list的下标会减小,导致遍历不完全

To Java程序员:切勿用普通for循环遍历LinkedList