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();