该用户从未签到
|
在项目开发中,我们可能往往需要动态的删除ArrayList中的一些元素。
8 D* }9 c; M7 ?! v; ~' i( U
0 K; v( `% E0 R一种错误的方式:& E! b, ^& f# H8 P4 ^
$ M0 b, q( U4 S<pre name="code" class="java">for(int i = 0 , len= list.size();i<len;++i){
$ W* ~7 {" i- y0 X5 I' [; I" J# J) a
if(list.get(i)==XXX){ ( k6 F0 q$ l! R/ Z! K/ b
3 X7 }* j# a3 V! _! ]( T
list.remove(i);
( B+ T- E$ ~! M. b4 A& R9 g" i. f9 d/ u7 _ c2 V. J: F% e
} ' I& c8 j0 A% v3 ~5 a- R+ R# _9 W! W
# U, T# ~! r6 ]4 q* ]0 X6 R
}
# j i f) c3 \( H上面这种方式会抛出如下异常:; n. o* p1 I7 W: e
; ], [' y; G9 I9 j5 t3 nException in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
. L2 B2 Z1 K9 m# [ at java.util.ArrayList.RangeCheck(Unknown Source) ; E7 z0 S! G* ?; U
at java.util.ArrayList.get(Unknown Source)
) `6 @0 y6 m P5 M/ h9 f% m. H at ListDemo.main(ListDemo.java:20)
- p, A+ X5 J/ u) n因为你删除了元素,但是未改变迭代的下标,这样当迭代到最后一个的时候就会抛异常咯。
. g- g. r4 ~# [, x5 d r6 U( n6 w0 j2 ]
可以对上面的程序进行如下改进:
' f# m9 j1 F! [. h& C3 _' Z" X7 W! g8 Y
for(int i = 0 , len= list.size();i<len;++i){ ' Y( [- w- V3 a0 Z/ B4 B- o$ C
( u( [4 K! T$ D. N0 O" ?9 E
if(list.get(i)==XXX){
w5 I; I' x9 a+ q, Q5 L0 W( B6 J' L- e9 U2 W
list.remove(i); ; y* P$ P2 H# ~: M8 D5 M7 f% N. y
--len;//减少一个
4 _% x) R9 f4 A8 H. c" P }
7 v2 N( ]* h- p. p% d- k% E2 f
( s" v9 `( M4 y) b} ( m3 w# U/ @ V8 i' V2 F7 v# Q
上面的代码就正确了。
4 u# x; C1 I( @) V4 D4 H) [
7 v& @9 q, A" q; o9 e6 ?下面我们再介绍一种方案:
/ a6 K8 U. [$ Z, ^6 f4 I6 [6 p" f1 m: _% h% K
List接口内部实现了Iterator接口,提供开发者一个iterator()得到当前list对象的一个iterator对象。
+ f6 |6 s* O- i& a
0 @. K. P4 L6 ?- n/ PIterator<String> sListIterator = list.iterator();
; `' @; N3 X5 jwhile(sListIterator.hasNext()){
7 u& B8 R8 Q, Z4 M8 f. { String e = sListIterator.next(); & B& B$ W2 I$ u
if(e.equals("3")){
& x K& o5 `+ V. W3 R) ^ sListIterator.remove(); 1 X) T# y8 x! f6 ]" S$ Y: M2 X
} 8 E, m8 ^6 w' L- O& H: r; J! ]- y9 L+ l
}
6 i8 B/ K. p; `/ [4 L$ R+ G; G上面这种也是正确的,并推荐使用第二种方案。
: f; p) m- z3 q3 f$ Y& B0 X" Z; c- x
两种方案实现原理都差多的,第二种只是jdk封装了下。. i3 A4 W3 c7 C+ ?
0 X. v! _1 y6 x查看ArrayList源码会发现很多方法内部都是基于iterator接口实现的,所以推荐使用第二种方案。; M5 I, l2 e1 p
9 C$ D8 x. p! f. s |
|