普通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中的元素(普通for循环增强for循环迭代器iteratorremoveIf+方法引用)