一、List删除元素方式
List接口当中主要提供了下列两种方法删除元素
//索引删除
E remove(int index);
//直接元素删除
boolean remove(Object o);
继承 Iterable<T> 中 Iterator<T> iterator() 接口提供删除方法,remove方法需要子类实现
default void remove() {
throw new UnsupportedOperationException("remove");
}
二、ArrayList和LinkedList删除测试
1.增强型for循环 元素删除
直接使用元素删除会报java.util.ConcurrentModificationException异常
testForList(new ArrayList<>());
testForList(new LinkedList<>());
public static void testForList(List<Integer> list) {
for (int i = 0; i < num; i++) {
list.add(getRandomNum());
}
System.out.println(list);
for (Integer temp : list) {
list.remove(temp);
}
}
2.fori循环 元素删除
通过list.get(index)方式 remove(object)删除不会报错,只是删除不正确
testForiList(new ArrayList<>());
testForiList(new LinkedList<>());
public static void testForiList(List<Integer> list) {
for (int i = 0; i < num; i++) {
list.add(getRandomNum());
}
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
list.remove(list.get(i));
}
System.out.println(list);
}
3.fori循环 索引删除
同第二种方式一样,不会报错,但是删除结果不正确
testForRemoveIndexList(new ArrayList<>());
testForRemoveIndexList(new LinkedList<>());
public static void testForRemoveIndexList(List<Integer> list) {
for (int i = 0; i < num; i++) {
list.add(getRandomNum());
}
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
list.remove(i);
}
System.out.println(list);
}
4.iterator迭代器删除
迭代器可以正确将元素删除,需要注意必须先调用next方法,不然将会抛出java.lang.IllegalStateException异常
testIteratorList(new ArrayList<>());
testIteratorList(new LinkedList<>());
public static void testIteratorList(List<Integer> list) {
for (int i = 0; i < num; i++) {
list.add(getRandomNum());
}
System.out.println(list);
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
it.next();
it.remove();
}
System.out.println(list);
}
三、总结
list集合遍历删除必须使用迭代器才能正确删除,有时候可能感觉fori删除不会报错,只有1个元素的时候又是正确的结果,所以需要注意这一点!