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