普通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根本没有遍历完,甚至有可以报空指针异常。
展开
8个回答
展开全部
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的值超出了当前集合的范围了,就会报异常
展开全部
是这样子的,你这种写法,应该不会报空指针。原因很简单,for(int i=0;i<list.size();i++){list.remove(i)},list.size(),每次循环都会执行,所以不会报空的,但是由于删除后,list大小减小,而i++,每次都会执行,所以可能遍历不完~建议如果你要是删除整个list,可以使用 list.clear();方法。
如果是遍历删除,一般选择迭代器删除的
如果是遍历删除,一般选择迭代器删除的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1.可以使用 snychronized 同步关键字 前提是 对象 list 也在 该类内
synchronized(this){
for(int i=0; i<list.size(); i++){
.......
list.remove(object);
.....................
}
}
表示 在被访问该段代码时 本类 不允许被其他对象 访问
2.对list 进行 重新包装 对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;
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;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
建议倒序循环删除
i<list.size();每次循环都会获得一次大小
然而你的i是每次都加的,list大小变动了,中间就有漏掉的
i<list.size();每次循环都会获得一次大小
然而你的i是每次都加的,list大小变动了,中间就有漏掉的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询