/ x7 n8 _8 O( E% uException in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3 . P' o( n- @) J i at java.util.ArrayList.RangeCheck(Unknown Source) ' i# B' w7 W3 ^: @6 F
at java.util.ArrayList.get(Unknown Source) 8 s3 s- T2 n/ n/ _: ^
at ListDemo.main(ListDemo.java:20) , K' ~6 D& p& r0 p因为你删除了元素,但是未改变迭代的下标,这样当迭代到最后一个的时候就会抛异常咯。 / H8 i4 n/ ~) ]# u2 j6 T9 J( C4 A. E8 d$ E- X' e
可以对上面的程序进行如下改进:) D" T; K# S( }
) ~: O W/ P6 a7 ~2 Dfor(int i = 0 , len= list.size();i<len;++i){ 1 S' X8 h$ B" D4 A) i9 Q
5 w, O- ~" J% o' H* K
if(list.get(i)==XXX){ # n. O# s/ o# B' d0 m% I- a7 Z! N9 K
& `' ]9 m9 p* Y6 f3 X9 ~ list.remove(i); ) g/ x% ]8 L) _6 y" S1 H --len;//减少一个 ' t7 f1 C1 O4 H3 `
} - S; w$ K+ m) k, c: `
8 W3 ~! ]: v$ Q* X5 _' U- H* i A
} / R% ^5 p O- P5 t7 z. s上面的代码就正确了。 # m s, Y; i3 s) d) r# t$ A8 ?3 c4 L: Z7 B. `, m4 c( t" d
下面我们再介绍一种方案: ( F% L0 ?/ z' @2 s0 @8 T/ Q7 A* b5 n" h& s) _3 g
List接口内部实现了Iterator接口,提供开发者一个iterator()得到当前list对象的一个iterator对象。" F5 {" E/ G0 M! {; _4 q
" j* [" P* X- h
Iterator<String> sListIterator = list.iterator(); ; y& i6 `6 X. g5 |# f
while(sListIterator.hasNext()){ ' `; }5 u1 K3 ]+ e, k
String e = sListIterator.next(); ) B5 n6 K3 v0 w' h7 y8 v if(e.equals("3")){ . `: j; o1 l6 V) p4 F& r8 N5 c sListIterator.remove(); 1 Y! j$ F3 j+ V# S/ Q" m& @. M9 L
} 2 ~ F" w% T9 P7 [& S
} 5 c7 q1 o" n/ n1 e. T8 M& x6 Z( I上面这种也是正确的,并推荐使用第二种方案。 0 y% X& `+ r7 L ( m- r; d! ?, s两种方案实现原理都差多的,第二种只是jdk封装了下。 ( o; |5 h5 S2 D0 z & y/ x& l6 H- S查看ArrayList源码会发现很多方法内部都是基于iterator接口实现的,所以推荐使用第二种方案。 & }9 o3 \4 e, F : t3 `' L! ]/ H- I1 {0 ]