如果是在for循环中调用remove方法,则会报数组越界错误,可以将for循环改为迭代器使用
Java的List在删除元素时,一般会用list.remove(o)/remove(i)方法
package com.kgc.demo;
import java.lang.reflect.Field;
import java.util.Vector;
public class TestMyFrame {
public static void main(String[] args) {
Vector<Integer> list=new Vector<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
System.out.println(list);
System.out.println("================");
//输出结果为[1, 2, 3, 4, 5]
System.out.println(list.toString());
System.out.println("================");
System.out.println(list.iterator());
System.out.println("================");
System.out.println(list.size());
//每次移除最后一个 获取对象
System.out.println(list.remove(list.size()-1));
System.out.println(list.remove(list.size()-1));
System.out.println(list.remove(list.size()-1));
System.out.println("================");
System.out.println(list);
System.out.println("================");
System.out.println(list.toString());
System.out.println("================");
System.out.println(list.iterator());
//每次移除第一个 获取对象
System.out.println("================");
System.out.println(list.size());
System.out.println(list.remove(0));
System.out.println(list.remove(0));
System.out.println("================");
System.out.println(list);
}
}
结果如下
[1, 2, 3, 4, 5]
================
[1, 2, 3, 4, 5]
================
java.util.Vector$Itr@659e0bfd
================
5
5
4
3
================
[1, 2]
[1, 2]
================
[1, 2]
================
java.util.Vector$Itr@2a139a55
================
2
1
2
================
[]
-
通过代码我们发现 Itr 是 ArrayList 中定义的一个私有内部类,
-
在 next、remove方法中都会调用checkForComodification 方法,该方法
-
的作用是判断 modCount != expectedModCount是否相等,如果不相等则抛
-
出ConcurrentModificationException异常。每次正常执行remove 方法后,
-
都会对执行expectedModCount = modCount赋值,保证两个值相等,那么问题
-
基本上已经清晰了,在 foreach 循环中执行 list.remove(item);,
-
对 list 对象的 modCount 值进行了修改,
-
而 list 对象的迭代器的 expectedModCount 值未进行修改,
-
因此抛出了ConcurrentModificationException异常。
总结:
1、用for循环遍历List删除元素时,需要注意索引会左移的问题。
2、List删除元素时,为避免陷阱,建议使用迭代器iterator的remove方式。
3、List删除元素时,默认按索引删除,而不是对象删除。