list的remove问题

1、增强的for循环里面不能调remove()。
2、在遍历的时候不能改变ArrayList,在遍历的时候进行修改就会报错 java.util.ConcurrentModificationException.
3、集合中 在遍历一个List时不能remove 。。。。当遍历一个链表时,每个数的前后指针都是确定的 当remove一个数值时 可能使得这个链表断掉 从而造成遍历不能正常进行和结束 因此 在遍历时 是不允许remove的。。。
4、要想改变list内容,用一般的for循环!
增强for循环只能迭代,不可修改List内容,具体原因看源码,
这是ArrayList中的add方法实现的源码,内部实现是采用数组实现的!而不是采用链表!
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
[color=red]5、List是不能直接remove的。如果需要移除用迭代器![/color]
6、迭代的时候不能直接 remove,一种办法是用 iterator.remove,ConcurrentModificationException 是说,当迭代器在跑循环时,有人把集合改了,这是不允许的,文档中明确列出了这种异常。

JCF 中说明了 ArrayList 不是一个线程集合,它不使用同步机制确保数据修改操作正确有序,但是会在迭代操作时设置版本号,在迭代器创建时保留一个版本号,每次移动指针,都要对比版 本号,如果有人改了就报错,因为这不符合约定的规则,结果是不可预料的。设计的考虑是:如果你不确信它是正确的,那就报错停下来,让程序员去修正这个不应 该出现的情况,我们不假设用什么办法能保证数据正确,因为为了性能考虑我们不保证线程安全,如果你想要线程安全就换用 Vector 之类的集合。这就像我们看到 C/C++ 的书里面介绍某些情况如果条件不符合要求的时候,结果是“未定义的”,我们这样做是明确列出“未定义的”行为需要程序员去纠正,API 不会做任何假设,它的好处是防止软件复杂性,如果随意处理未定义的行为,大型软件的复杂性就无法控制而且很难调试找到原因。
7、在循环的时候不能修改 list,set,map 等集合的值。
如果一定要修改。就用Iterator.remove();
8、一般来说,增强型for循环只适用于查询日常操作,如果你要修改只能用一般的for循环,或者引入迭代器
9、这个问题为什么会报这种异常,其实想想也不难发现。
ArrayList底层是数组实现的,假设现在有a[0]=1,a[1]=2,a[2]=3
用for循环遍历的时候
for(int i=0;i<a.length;i++){
}
假设遍历到第二个数 也就是a[1]的时候,删除了a[1] ArrayList的底层是将a[1]后面的数向前移动一个位置,由于下标改了 i没改 这样就会发生一些问题 所以就出现在遍历的时候改变整个数组 就干脆抛异常了

用迭代的方式则没这个问题


简化的for-each循环实际上只是一个语法糖,会被编译器转化成以下等价的代码:
for( Iterator<ComType> iter = ComList.iterator(); iter.hasNext();){
ComType com = iter.next();
if ( !com.getName().contains("abc")){
ComList.remove(com);
}
}

也就是说,你在同时遍历和删除一个List,大多List实现是不允许这种操作的(某些List实现允许同时遍历和修改,例如CopyOnWriteArrayList),会抛并发修改异常。(具体可以参考ArrayList的源代码,ArrayList上面的ArrayList.iterator()操作会记录当前的修改次数modCount,remove/add操作会让修改次数自增,即modCount++,因此就能判断出来是否是并发修改了)

解决方法:

使用Iterator遍历的同时,使用Iterator.remove()删除你想删除的元素。另外也可以参考一下ListIterator,上面有很多针对List的方法。

for( Iterator<ComType> iter = ComList.iterator(); iter.hasNext();){
ComType com = iter.next();
if ( !com.getName().contains("abc")){
iter.remove();
}
}

参考网址:
http://hi.baidu.com/jack_cl/blog/item/426f22103e3cda0db8127bc1.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值