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