1. 程式人生 > >Java循環遍歷中直接修改遍歷對象

Java循環遍歷中直接修改遍歷對象

span spa ++ source i++ add ren rem color

Java 循環遍歷中直接修改遍歷對象如下,會報異常:
for (ShopBaseInfo sp: sourceList) {
if(sp.getId()==5){
sourceList.remove(sp);
}
}

Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)

如果有需要修改循環遍歷對象的需求,可以使用叠代器來實現,代碼如下:

/**
* @author jack
**/
public class ForLoopTest {

public static void main(String[] args) {
List<ShopBaseInfo> sourceList = new ArrayList<ShopBaseInfo>();
ShopBaseInfo shop = null;
for (long i=0 ;i<8;i++){
shop = new ShopBaseInfo();
shop.setId(i);
shop.setShopName("shop"+i);
sourceList.add(shop);
}
System.out.println("sourcelist init --------");
printList(sourceList);
/* for (ShopBaseInfo sp: sourceList) {
if(sp.getId()==5){
sourceList.remove(sp);
}
}*/

Iterator<ShopBaseInfo> iterator = sourceList.iterator();
while (iterator.hasNext()) {
ShopBaseInfo sbi = iterator.next();
if(sbi.getId() == 5){
iterator.remove();
}
}
System.out.println("after sourcelist remove --------");
printList(sourceList);
}

private static void printList(List<ShopBaseInfo> sourceList){
StringBuilder builder = new StringBuilder();
for (ShopBaseInfo shop : sourceList ) {
builder.append("->").append(shop.getShopName());
}

System.out.println(builder);
}
}

運行結果:
sourcelist init --------
->shop0->shop1->shop2->shop3->shop4->shop5->shop6->shop7
after sourcelist remove --------
->shop0->shop1->shop2->shop3->shop4->shop6->shop7

Java循環遍歷中直接修改遍歷對象