该用户从未签到
|
在项目开发中,我们可能往往需要动态的删除ArrayList中的一些元素。- c1 ]% S; ?; E' I8 \
8 x. V' M: w% R% T8 M C
一种错误的方式:
9 `; N% `. S) H' I" b: P
/ O, X5 j/ A, o! i7 }<pre name="code" class="java">for(int i = 0 , len= list.size();i<len;++i){
4 X5 o6 H# S! A* I' b4 X1 a
: ]% {' d+ W3 B& V) X if(list.get(i)==XXX){ 6 }7 F: O7 W% i4 m6 F
" S. `1 w- u# V' A" i/ ^
list.remove(i);
$ H! h" B5 w4 s' X+ U0 V: y, n7 V) n/ m
}
5 w1 C6 W; B9 T# |) Q
1 Q4 c e" H& ~. Y} $ f& J& j4 E% l, |5 H- u0 `
上面这种方式会抛出如下异常:
6 t6 p S: R2 D U8 }5 J) C
; k, N& M1 n" R; i! RException in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
. s& G$ l, i4 L X* @" \4 N' b at java.util.ArrayList.RangeCheck(Unknown Source)
0 @3 j9 v( T2 j+ U5 h# i: N at java.util.ArrayList.get(Unknown Source) % \! _6 t, }/ P8 m R. `
at ListDemo.main(ListDemo.java:20) # `: h7 N2 n$ \5 q1 C9 S ^) W
因为你删除了元素,但是未改变迭代的下标,这样当迭代到最后一个的时候就会抛异常咯。# ?" Y5 o) z7 K2 B9 [- h8 A8 x5 T
' H4 Q; x$ V* s. {8 T8 J3 ]$ ^可以对上面的程序进行如下改进:7 T' Y/ l( k; l; F1 n
: M) c0 U9 L2 u& U
for(int i = 0 , len= list.size();i<len;++i){ ; D3 \6 ? \4 _0 e- r% y3 i
E. r) W. @, f, \% }1 _ if(list.get(i)==XXX){ # n0 j/ g9 G8 k1 }+ O( ^
" \$ d T, W5 ?9 B: @; t
list.remove(i);
2 ~' [; U* ~3 ~( h( T7 t+ a- E --len;//减少一个
/ E$ |8 q& o; ? }
2 W$ ?( e, e4 T9 N: u% c. K1 s3 g5 B/ N, C2 t3 V0 u4 z0 z. ?; h: Y4 M
} ! F2 S; ^0 v S' k! ?, N, e$ w
上面的代码就正确了。
% w" |" W) W$ }4 t
4 x w" h- G! r2 n下面我们再介绍一种方案:
8 g% d3 j& q b
0 `9 x. W, b% x& ZList接口内部实现了Iterator接口,提供开发者一个iterator()得到当前list对象的一个iterator对象。/ Q3 X; y+ y# J
5 h- d' }6 `6 W8 wIterator<String> sListIterator = list.iterator();
' b) g# v( b7 b2 Fwhile(sListIterator.hasNext()){ ! ~, |- o3 u8 H
String e = sListIterator.next(); 4 q! A t1 U( k. b$ t+ W
if(e.equals("3")){ $ H, ?9 l. R! i# @& u1 X
sListIterator.remove(); ; i" Y" W# f) N5 s# u- X# e
} 7 {9 d2 ]" T% t" k
}
) ~& u/ \0 ~! l0 z( H+ \上面这种也是正确的,并推荐使用第二种方案。! D# L( h. q: R1 X# s( L
% S# Z& F% N/ C4 E" Q `两种方案实现原理都差多的,第二种只是jdk封装了下。, Y# Z5 Y! @) t/ [* {/ s1 Q
0 `7 ~9 P7 D$ h
查看ArrayList源码会发现很多方法内部都是基于iterator接口实现的,所以推荐使用第二种方案。
; E8 z. ^, j# P* H. t# ?: G4 F$ M5 C) t+ q, [. k( h
|
|