網(wǎng)站開發(fā)要多錢廊坊網(wǎng)站設(shè)計(jì)
關(guān)于集合元素的remove
? 重點(diǎn):當(dāng)集合的結(jié)構(gòu)發(fā)生改變時(shí),迭代器必須重新獲取,如果還是用以前老的迭代器,會出現(xiàn)異常
? java.util.ConcurrentModificationException
? 重點(diǎn):在迭代集合元素的過程中,不能調(diào)用集合對象的remove方法,刪除元素c.remove(o);迭代過程中不能這樣
?會出現(xiàn):java.util.ConcurrentModificationException
?重點(diǎn):在迭代元素的過程中,一定要使用迭代器Iterator的remove方法,刪除元素,不要使用集合自帶的remove方法刪除元素
?import java.util.ArrayList;
?import java.util.Collection;
?import java.util.Iterator;
? public class CollectionTest06{
??? public static void main(String[] args){
????? //創(chuàng)建集合
????? Collection c = new ArrayList();
???? //注意:此時(shí)獲取的迭代器,指向的是那是集合中沒有元素狀態(tài)下的迭代器。
??? //一定要注意:集合結(jié)構(gòu)只要發(fā)生改變,迭代器必須重新獲取
//當(dāng)集合結(jié)構(gòu)發(fā)生了改變,迭代器沒有重新獲取的時(shí)候,調(diào)用next()方法是出現(xiàn)異常
? //java.util.ConcurrentModificationException
?? //Integer it = c.iterator();
?
???? //添加元素
???? c.add(1);?? //Integer類型
???? c.add(2);
???? c.add(3);
??? //獲取迭代器
???? Iterator it = c.iterator();
???? while(it.hasNext()){
?????? //編寫代碼時(shí)next()方法返回值類型必須是Object
????? //Integer i=it.next();
???? Object obj = it.next();
???? System.out.println(obj);
???? }
???? Collection c2 = new ArrayList();
???? c2.add("abc");
???? c2.add("def");
???? c2.add("xyz");
????
??? Iterator it2 = c2.iterator();
??? while(it2.hasNext()){
??????? Object o = it2.next();
??????? //刪除元素
?????? //刪除元素之后,集合的結(jié)構(gòu)發(fā)生了變化,應(yīng)該重新去獲取迭代器
????? //但是,循環(huán)下一次的時(shí)候并沒有重新獲取迭代器,所以會出現(xiàn)異常:java.util.ConcurrentModificationException
???? //出異常根本原因是:集合中元素刪除了,但是沒有更新迭代器(迭代器不知道集合變化了)
???? // c2.remove(o); //直接通過集合去刪除元素,沒有通知迭代器(導(dǎo)致迭代器的快照和原集合狀態(tài)不同)
???? //使用迭代器來刪除可以嗎?
??? //迭代器去刪除時(shí),會自動更新迭代器,并且更新集合(刪除集合中的元素)
????? it2.remove();?? //刪除的一定是迭代器指向的當(dāng)前元素
????? System.out.println(o);
???? }
???? System.out.println(c2.size()); //0
??
?}
}