ArrayList的for循环的删除问题


List<SaleCategoryDTO> saleCategoryList = saleCategoryDaoImpl.querySaleCategoryList(storeCode);

 for(int i=0;i<size;i++){

   SaleCategoryDTO  saleCategoryDTO=saleCategoryList.get(i);

   if(saleCategoryDTO.getDownList==null){

    saleCategoryList.remove(i);

  }

}  

发现有部分没有被删除掉。通过查看ArrayList源码

public E remove(int index) {
rangeCheck(index);

modCount++;
E oldValue = elementData(index);

int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
elementData[--size] = null; // clear to let GC do its work

return oldValue;
}

当前面有个元素删除时,后台的元素后移动,后面符合条件的向前移动,而i向后移动。

可以使用倒序解决该问题。

ArrayList<String> list=new ArrayList();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
for(String item:list){
if("b".equals(item)){
list.remove(item);
}
}

会报  java.util.ConcurrentModificationException 异常,因为for实际上调用的是iterator,ArrayList的迭代器实现在其

父类的AbstractList里,源码如下:

public E next() {
checkForComodification();
try {
int i = cursor;
E next = get(i);
lastRet = i;
cursor = i + 1;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}

final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
} 该句会检查修改次数。

解决办法如下:

Iterator<String> it = list.iterator();

while (it.hasNext())
{
String s = it.next();
if (s.equals("b"))
{
it.remove();
}
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM