本帖最后由 邹学良 于 2013-3-9 15:39 编辑
运行了下,不管是比较list开始索引位或者最后一个索引位的数据:是不是有索引越界的感觉?
都会抛出异常:java.util.ConcurrentModificationException
原因是在调用checkForComodification和next方法出错:
找了这个位置的源码看了下:结论是:
迭代集合每次remove后的size都会发生变化,如果迭代基数不根据remove后的size动态调整,则会发生索引越界异常或内容遍历不全等问题ckForComodification方法和next方法时执行有问题,在调用“AAA”时,它是作为集合第一个索引也是结束位索,在List集合中,它的修改操作(add/remove)都会对modCount这个字段+1,modCount可以看作一个版本号,每次集合中的元素被修改后,都会+1(即使溢出)。
之后修正了下代码:- public class Test2 {
- public static void main(String[] args){
- List<String> list = new ArrayList<String>();
- list.add("aaa");
- list.add("bbb");
- list.add("ccc");
- Iterator<String> it = list.iterator();
- while(it.hasNext()){
- if("aaa".equals(it.next()))
- it.remove();
- }
- System.out.println(list);
- }
- }
复制代码 输出打印效果:
BBB,CCC
|