今天写一段代码时遇到了点小问题,遍历某个List,当符合条件时删除该项。第一种写法报错,第二种写法只删了一半,第三种写法正确。我记得以前看过,说是第一种写法是指针性质的,不能这样删除。希望有人详细说一下。第二种方法我的理解是:当删除了当前项后,下一项会向前移,下标变为当前项,所以下一项不会做判断。
求人指点或探讨。谢谢!
1.
List<Detail> mqList=bean.getMqList();
for(Detail d:mqList){
  if(符合某条件){
    mqList.remove(d);
}
}2.
List<Detail> mqList=bean.getMqList();
for(int i=0;i<mqList.size();i++){
  if(符合某条件){
    mqList.remove(i);
}
}3.
List<Detail> mqList=bean.getMqList();
Iterator i=mqList.iterator();
while(i.hasNext()){
  if(符合某条件){
    i.remove();
}
}

解决方案 »

  1.   

    第一种写法,实际上走的是迭代器,而List的remove不会更新迭代器状态,具体参见这里:
    http://www.blogjava.net/fingki/archive/2010/03/02/314268.html
    第二种写法的问题很简单,就是移除后元素减少了,但是计数器(i)没有响应减少,所以位置就错了;
    第三种写法是第一种的改进,正确的使用了Iterator的remove,而不是List自己的remove,所以正确。
    还有可以这么写:
    while(!mqList.isEmpty()) {
      Detail d = mqList.remove(0);
    }
      

  2.   

    第一种会报错,楼主看下ArrayList源码,了解下modCount、expectedModCount两个变量
    第二种,remove(i)后,i+1那个位置的就漏掉了,所以,执行remove(i)后,要i--