javase-collection-210619-01
- Collection------remove()
在集合中使用remove()方法,会使得集合的结构发生改变,如果此时迭代器还是原来的那个,会报错
例子:CollectionTest02.java
1. 如果使用集合的remove()方法进行删除,要通知迭代器更新,否则报错
2. 或者使用迭代器的remove()方法进行删除
CollectionTest01.java
package bgy_test_2161901;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionTest01 {
public static void main(String[] args) {
// 1. 创建集合
Collection c = new ArrayList();
/*
在这里获取迭代器,报异常 java.util.ConcurrentModificationException
此时的迭代器,指向的是集合中没有元素状态下的迭代器
注意:集合中结构只要发生变化,迭代器必须重新获取
当集合结构发生了改变,迭代器没有重新获取,调用next()方法时,报上面的异常
*/
// Iterator it = c.iterator();
c.add("a");
c.add("b");
c.add("c");
// 正确方法,在这里调用
// 获取迭代器Iterator
Iterator it = c.iterator();
while (it.hasNext()) {
// 编写代码 next() 时,返回结果必须是Object
Object obj = it.next();
System.out.println(obj);
}
}
}
CollectonTest02.java
package bgy_test_2161901;
/*
集合元素的remove方法
当集合结构发生改变时,迭代器必须重新获取,
如果还用老的迭代器会抛出异常:java.util.ConcurrentModificationException
boolean remove(Object o)
从该集合中删除指定元素的单个实例(如果存在)(可选操作)。
更正式地,删除元素e ,使得(o==null ? e==null : o.equals(e)) ,如果该集合包含一个或多个这样的元素。
如果此集合包含指定的元素(或等效地,如果此集合由于调用而更改),则返回true 。
1.
在迭代集合元素的过程中,不能调用集合对象的remove()方法,删除元素
即 c.remove(o);
迭代过程中不能这样弄,会抛出异常java.util.ConcurrentModificationException
当然你可以通过把迭代器更新: 即 it2 = c.iterator();
2.
在迭代集合元素的过程中,一定要使用迭代器Iterator 的 remove() 方法,删除元素
即:
iterator.remove(); // 迭代器指向的当前的元素
不要使用集合自带的remove方法来删除
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionTest02 {
public static void main(String[] args) {
// 1. 创建集合
Collection c = new ArrayList();
// 2. 获取迭代器 it1
Iterator it1 = c.iterator();
// 3. 添加元素
c.add("a");
c.add("b");
c.add("c");
Iterator it2 = c.iterator();
// 5. 迭代
while (it2.hasNext()) {
Object o = it2.next();
/*
1.
c.remove(o) 直接通过集合删除元素,没有通知迭代器(迭代器快照和原集合状态不同)
循环下一次的时候如果没有重新获取迭代器,会抛异常
重新获取迭代器可以解决这个问题
*/
// c.remove(o);
// // 重新获取迭代器it2
// it2 = c.iterator();
// System.out.println(c);
/*
2.
it2.remove() 删除的定是迭代器指向的当前的元素
使用迭代器来删除元素
迭代器删除元素时,会自动更新迭代器,并且更新集合
*/
it2.remove();
System.out.println(c);
}
}
}