|
该用户从未签到
|
在项目开发中,我们可能往往需要动态的删除ArrayList中的一些元素。
- L; J1 Q8 g: c5 j% c
0 `2 w: [; w& o- j一种错误的方式:3 G7 H6 B( @: @
0 t9 }" c3 h' o3 h. C, j
<pre name="code" class="java">for(int i = 0 , len= list.size();i<len;++i){ ) @# O8 c5 Y. G6 ]
& F/ F! ~& h: ^ k' O
if(list.get(i)==XXX){ , S, f& T" A: r* h5 g
4 W. q6 v$ Y" @6 ~
list.remove(i);
. }9 E$ T" Q3 {5 l- ~9 F* M9 M1 U: V, b6 O5 J% u
} : f/ h5 r* W) M m
8 N" K9 g! C$ x. M. J# k} : h% z0 p% d+ O0 A- y Y' F! _. U
上面这种方式会抛出如下异常:
. R& j/ b% {( o! ?: Q. N2 R& c- D2 O( |2 m4 o7 k% o) n0 g
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 9 D. k! N% |2 U2 g( V7 J
at java.util.ArrayList.RangeCheck(Unknown Source) 2 K! m' N7 a- b; ^# O
at java.util.ArrayList.get(Unknown Source) ; ?0 j O" A, T
at ListDemo.main(ListDemo.java:20) 0 D( ?: m2 R0 k; b! E% U6 r* G
因为你删除了元素,但是未改变迭代的下标,这样当迭代到最后一个的时候就会抛异常咯。
/ B& j& \, i. z2 V5 j( p% Z' x+ }; F. ?" Z, _4 b
可以对上面的程序进行如下改进:
$ h8 W' n1 P8 I M R# P- k- y2 Z e7 ?( i3 S( B
for(int i = 0 , len= list.size();i<len;++i){ 0 B0 y: Z1 R* J
1 ~) ]0 r4 _% T4 [
if(list.get(i)==XXX){ ) F* J) h3 w, A
{+ T5 J: c; P/ D
list.remove(i); 2 J) g& Y6 K! ^
--len;//减少一个
( t7 K5 T* M0 u" C& c } + U! F+ M+ t$ M
9 b5 Z4 j1 u* n/ i% U! C0 f}
2 n3 e) J1 `- P( S* F9 q& R) A, h上面的代码就正确了。
# b7 ]0 g6 q6 J' N2 b% I; t- D! x# a, Q/ w" _1 ^( x
下面我们再介绍一种方案:+ D$ `2 o5 X! ~4 ? b, e8 L
4 p8 v! e; h2 m
List接口内部实现了Iterator接口,提供开发者一个iterator()得到当前list对象的一个iterator对象。6 c( J' d; e1 d. c# D6 c& i! g
, v% _* q* R4 C
Iterator<String> sListIterator = list.iterator(); . k4 W3 j) \( D$ J+ S
while(sListIterator.hasNext()){
& F% m( O6 t+ K# { String e = sListIterator.next(); ) {8 |2 C, E: x
if(e.equals("3")){
# U- i# V0 J9 s sListIterator.remove(); 1 K0 C, G+ [- T" _9 K
} 0 k. S0 _% {5 W$ i
} ! ?; E8 v# x) Q( r
上面这种也是正确的,并推荐使用第二种方案。
3 w& S! g( e w' g0 @' D8 i. p. H. O3 B. i; A# a. y& Y
两种方案实现原理都差多的,第二种只是jdk封装了下。
" H! }6 Z# f: z: ], a2 X& S _/ B1 z5 n A4 Y. i. z' |( P9 z
查看ArrayList源码会发现很多方法内部都是基于iterator接口实现的,所以推荐使用第二种方案。/ g$ S' z2 T# ~/ Y8 y' l
- L' a5 s3 @$ W2 H4 ^ |
|