Java集合类ArrayList循环中删除特定元素
生活随笔
收集整理的這篇文章主要介紹了
Java集合类ArrayList循环中删除特定元素
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在項(xiàng)目開(kāi)發(fā)中,我們可能往往需要?jiǎng)討B(tài)的刪除ArrayList中的一些元素。
一種錯(cuò)誤的方式:
[java]?view plain?copy for(int?i?=?0?,?len=?list.size();i<len;++i){?? ??if(list.get(i)==XXX){?? ???????list.remove(i);?? ??}?? }??
上面這種方式會(huì)拋出如下異常:
[java]?view plain?copy Exception?in?thread?"main"?java.lang.IndexOutOfBoundsException:?Index:?3,?Size:?3?? ????at?java.util.ArrayList.RangeCheck(Unknown?Source)?? ????at?java.util.ArrayList.get(Unknown?Source)?? ????at?ListDemo.main(ListDemo.java:20)??
因?yàn)槟銊h除了元素,但是未改變迭代的下標(biāo),這樣當(dāng)?shù)阶詈笠粋€(gè)的時(shí)候就會(huì)拋異常咯。
可以對(duì)上面的程序進(jìn)行如下改進(jìn):
[java]?view plain?copy for(int?i?=?0?,?len=?list.size();i<len;++i){?? ??if(list.get(i)==XXX){?? ???????list.remove(i);?? ???????--len;//減少一個(gè)?? ???????--i;//多謝deny_guoshou指正,如果不加會(huì)出現(xiàn)評(píng)論1樓所說(shuō)的情況。?? ?}?? }??
上面的代碼就正確了。
下面我們?cè)俳榻B一種方案:
List接口內(nèi)部實(shí)現(xiàn)了Iterator接口,提供開(kāi)發(fā)者一個(gè)iterator()得到當(dāng)前l(fā)ist對(duì)象的一個(gè)iterator對(duì)象。
[java]?view plain?copy Iterator<String>?sListIterator?=?list.iterator();?? while(sListIterator.hasNext()){?? ????String?e?=?sListIterator.next();?? ????if(e.equals("3")){?? ????sListIterator.remove();?? ????}?? }??
上面這種也是正確的,并推薦使用第二種方案。
兩種方案實(shí)現(xiàn)原理都差多的,第二種只是jdk封裝了下。
一種錯(cuò)誤的方式:
[java]?view plain?copy
上面這種方式會(huì)拋出如下異常:
[java]?view plain?copy
因?yàn)槟銊h除了元素,但是未改變迭代的下標(biāo),這樣當(dāng)?shù)阶詈笠粋€(gè)的時(shí)候就會(huì)拋異常咯。
可以對(duì)上面的程序進(jìn)行如下改進(jìn):
[java]?view plain?copy
上面的代碼就正確了。
下面我們?cè)俳榻B一種方案:
List接口內(nèi)部實(shí)現(xiàn)了Iterator接口,提供開(kāi)發(fā)者一個(gè)iterator()得到當(dāng)前l(fā)ist對(duì)象的一個(gè)iterator對(duì)象。
[java]?view plain?copy
上面這種也是正確的,并推薦使用第二種方案。
兩種方案實(shí)現(xiàn)原理都差多的,第二種只是jdk封裝了下。
查看ArrayList源碼會(huì)發(fā)現(xiàn)很多方法內(nèi)部都是基于iterator接口實(shí)現(xiàn)的,所以推薦使用第二種方案。
from:?https://blog.csdn.net/lazy_p/article/details/7365324
總結(jié)
以上是生活随笔為你收集整理的Java集合类ArrayList循环中删除特定元素的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ArrayList遍历的同时删除
- 下一篇: Java 8新特性终极指南