印象中循環(huán)刪除list中的元素使用for循環(huán)的方式是有問題的,,但是可以使用增強(qiáng)的for循環(huán),,然后今天在使用時(shí)發(fā)現(xiàn)報(bào)錯(cuò)了,然后去科普了一下,,再然后發(fā)現(xiàn)這是一個(gè)誤區(qū),。下面就來講一講。,。伸手黨可直接跳至文末,??纯偨Y(jié),。。 JAVA中循環(huán)遍歷list有三種方式for循環(huán),、增強(qiáng)for循環(huán)(也就是常說的foreach循環(huán)),、iterator遍歷。
1,、for循環(huán)遍歷list for(int i=0;i<list.size();i++){ if(list.get(i).equals("del")) list.remove(i); } 這種方式的問題在于,,刪除某個(gè)元素后,list的大小發(fā)生了變化,,而你的索引也在變化,,所以會導(dǎo)致你在遍歷的時(shí)候漏掉某些元素。比如當(dāng)你刪除第1個(gè)元素后,,繼續(xù)根據(jù)索引訪問第2個(gè)元素時(shí),,因?yàn)閯h除的關(guān)系后面的元素都往前移動(dòng)了一位,所以實(shí)際訪問的是第3個(gè)元素,。因此,,這種方式可以用在刪除特定的一個(gè)元素時(shí)使用,但不適合循環(huán)刪除多個(gè)元素時(shí)使用,。
2,、增強(qiáng)for循環(huán) for(String x:list){ if(x.equals("del")) list.remove(x); } 這種方式的問題在于,刪除元素后繼續(xù)循環(huán)會報(bào)錯(cuò)誤信息ConcurrentModificationException,,因?yàn)樵卦谑褂玫臅r(shí)候發(fā)生了并發(fā)的修改,,導(dǎo)致異常拋出,。但是刪除完畢馬上使用break跳出,則不會觸發(fā)報(bào)錯(cuò),。
3,、iterator遍歷 Iterator<String> it = list.iterator(); while(it.hasNext()){ String x = it.next(); if(x.equals("del")){ it.remove(); } } 這種方式可以正常的循環(huán)及刪除。但要注意的是,,使用iterator的remove方法,,如果用list的remove方法同樣會報(bào)上面提到的ConcurrentModificationException錯(cuò)誤。 總結(jié): ?。?)循環(huán)刪除list中特定一個(gè)元素的,,可以使用三種方式中的任意一種,但在使用中要注意上面分析的各個(gè)問題,。 ?。?)循環(huán)刪除list中多個(gè)元素的,應(yīng)該使用迭代器iterator方式,。 原文鏈接:https://www.cnblogs.com/pcheng/p/5336903.html |
|