( {5 o' {! @# U, j一种错误的方式:9 ]6 \% r/ e9 P. K- l
8 u4 Y0 [, t( O; y5 e1 V3 w
<pre name="code" class="java">for(int i = 0 , len= list.size();i<len;++i){ $ e" _* H- y" ?' j) m: |; N
! H* f1 i+ B* U3 d0 x if(list.get(i)==XXX){ + Z% U; B* L" a$ {
2 n/ R% F6 {# x9 ^8 n: b8 T$ I
list.remove(i); 1 O% X7 {9 b; K: T% N6 ] & ]; h& p% F2 f+ C% o& D } & L: P2 F" ]1 [; E& N: S
4 w. `; l% d7 n
} 7 [: N+ h' k' X3 K9 d8 Z3 }
上面这种方式会抛出如下异常:. B8 M+ e0 Y8 f) _) n6 l) c
, R7 @! _( L* q) d, K8 X" vException in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 9 A$ p* g% O g1 S3 V0 z0 B8 g at java.util.ArrayList.RangeCheck(Unknown Source) % l; m% L1 q) X% Z. D
at java.util.ArrayList.get(Unknown Source) 7 `/ }& }, B) f' w& V" S at ListDemo.main(ListDemo.java:20) - b, _# _# _) }5 O8 B6 Q8 P因为你删除了元素,但是未改变迭代的下标,这样当迭代到最后一个的时候就会抛异常咯。- m) j4 w; Z. A8 c
: N0 d2 f% K' k) J( H" n可以对上面的程序进行如下改进: ( ]: U9 G1 S# t* p8 ~. Z4 o & ]2 P a3 l+ A: N4 Rfor(int i = 0 , len= list.size();i<len;++i){ 4 ~. L8 u0 N9 z7 ]9 ~ ^7 }! _- R/ s l8 t7 G
if(list.get(i)==XXX){ ! N3 w/ W+ ?- E( ^5 m4 l8 p9 q+ U 6 r3 f9 Y8 ^- F7 h list.remove(i); + @0 f6 N/ H" ~) i! g0 o
--len;//减少一个 0 J6 A4 m) T# W0 ?( Q
} * Q- M4 x& T' W" o3 @& Z3 O