java arraylist 迭代器_[JAVA] ArrayList循环删除陷阱及迭代器介绍

一  ArrayList循环删除陷阱

模板测试代码如下:

public classArrayListRemove {public static voidmain(String[] args) {

ArrayList list = new ArrayList();

list.add("a");

list.add("bb");

list.add("bb");

list.add("ccc");

list.add("ccc");

list.add("ccc");

remove(list);//执行删除//打印列表元素

for(String s : list) {

System.out.println("element : " +s);

}

}public static void remove(ArrayListlist) {//TODO

}

}

1  错误写法一

public static void remove(ArrayListlist) {for (int i = 0; i < list.size(); i++) {if ("bb".equals(list.get(i))){

list.remove(i);

}

}

}

执行结果如下:

element : a

element : bb

element : ccc

element : ccc

element : ccc

可以发现,有一个"bb"的字符串没有被删除掉。

2  错误写法二

public static void remove(ArrayListlist) {for(String s : list) {if ("bb".equals(s)) {

list.remove(s);

}

}

}

执行结果如下:

Exception in thread "main"java.util.ConcurrentModificationException

at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)

at java.util.ArrayList$Itr.next(ArrayList.java:851)

at com.dh.yjt.SpringBootDemo.test.Collection.ArrayListRemove.remove(ArrayListRemove.java:24)

at com.dh.yjt.SpringBootDemo.test.Collection.ArrayListRemove.main(ArrayListRemove.java:16)

发现抛出ConcurrentModificationException的异常。

3  问题分析

要分析产生上述错误现象的原因唯有翻一翻jdk的ArrayList源码,先看下ArrayList中的remove方法(注意ArrayList中的remove有两个同名方法,只是入参不同,这里看的是入参为Object的remove方法)是怎么实现的:

public booleanremove(Object o) {if (o == null) {for (int index = 0; index < size; index++)if (elementData[index] == null) {

fastRemove(index);return true;

}

}else{for (int index = 0; index < size; index++)if(o.equals(elementData[index])) {

fastRemove(index);return true;

}

}return false;

}

发现最终都会调用f

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值