在項(xiàng)目開發(fā)中,我們可能往往需要?jiǎng)討B(tài)的刪除ArrayList中的一些元素。
一種錯(cuò)誤的方式:
1
2
3
4
5
6
7
8
9
|
<pre name= "code" class = "java" > for ( int i = 0 , len= list.size();i<len;++i){ if (list.get(i)==XXX){ list.remove(i); } } |
上面這種方式會(huì)拋出如下異常:
1
2
3
4
|
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):
1
2
3
4
5
6
7
8
9
|
for ( int i = 0 , len= list.size();i<len;++i){ if (list.get(i)==XXX){ list.remove(i); --len; //減少一個(gè) } } |
上面的代碼就正確了。
下面我們再介紹一種方案:
List接口內(nèi)部實(shí)現(xiàn)了Iterator接口,提供開發(fā)者一個(gè)iterator()得到當(dāng)前l(fā)ist對(duì)象的一個(gè)iterator對(duì)象。
1
2
3
4
5
6
7
|
Iterator<String> sListIterator = list.iterator(); while (sListIterator.hasNext()){ String e = sListIterator.next(); if (e.equals( "3" )){ sListIterator.remove(); } } |
上面這種也是正確的,并推薦使用第二種方案。
兩種方案實(shí)現(xiàn)原理都差多的,第二種只是jdk封裝了下。
查看ArrayList源碼會(huì)發(fā)現(xiàn)很多方法內(nèi)部都是基于iterator接口實(shí)現(xiàn)的,所以推薦使用第二種方案。
以上就是小編為大家?guī)淼膉ava集合類arraylist循環(huán)中刪除特定元素的方法全部內(nèi)容了,希望大家多多支持服務(wù)器之家~