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

当我们用普通for循环时会这样写for(inti=0;i<list.size();i++){},在循环体内使用list.remove(object)方法时,list.si... 当我们用普通for循环时会这样写for(int i=0;i<list.size();i++){},在循环体内使用list.remove(object)方法时,list.size()是会跟着改变的,但是i却没有变。所以list根本没有遍历完,甚至有可以报空指针异常。 展开
 我来答
shen520110
推荐于2017-10-05 · TA获得超过431个赞
知道小有建树答主
回答量:113
采纳率:0%
帮助的人:124万
展开全部
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的值超出了当前集合的范围了,就会报异常
百度网友baa402f
2012-07-13
知道答主
回答量:17
采纳率:100%
帮助的人:7.4万
展开全部
是这样子的,你这种写法,应该不会报空指针。原因很简单,for(int i=0;i<list.size();i++){list.remove(i)},list.size(),每次循环都会执行,所以不会报空的,但是由于删除后,list大小减小,而i++,每次都会执行,所以可能遍历不完~建议如果你要是删除整个list,可以使用 list.clear();方法。

如果是遍历删除,一般选择迭代器删除的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友904220baaf
2011-05-26 · TA获得超过127个赞
知道答主
回答量:48
采纳率:0%
帮助的人:33.7万
展开全部
1.可以使用 snychronized 同步关键字 前提是 对象 list 也在 该类内

synchronized(this){
for(int i=0; i<list.size(); i++){
.......
list.remove(object);
.....................
}
}
表示 在被访问该段代码时 本类 不允许被其他对象 访问

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

说白了 就是 同步的问题
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-05-20
展开全部
你的意思是不是这样:
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;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zgh26782000
2011-05-19 · TA获得超过1453个赞
知道小有建树答主
回答量:788
采纳率:0%
帮助的人:500万
展开全部
建议倒序循环删除
i<list.size();每次循环都会获得一次大小
然而你的i是每次都加的,list大小变动了,中间就有漏掉的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(6)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式