TA的每日心情 | 衰 2021-2-2 11:21 |
---|
签到天数: 36 天 [LV.5]常住居民I
|
在项目开发中,我们可能往往需要动态的删除ArrayList中的一些元素。; {5 p: c, Z( S/ ~) R" M
: \3 r# ]4 Z6 c; f2 `6 T" s一种错误的方式:
2 R( e# N* u" a H) @6 T+ K. b
% N+ z" O( t9 g/ U<pre name="code" class="java">for(int i = 0 , len= list.size();i<len;++i){ / }- J" C, R b' u. Q6 L" p$ G
8 \9 a5 M5 s; Z+ {$ E/ e, _ if(list.get(i)==XXX){
% D5 U% n2 u0 F4 g# `5 n/ C/ }9 P7 A
list.remove(i);
7 d6 p6 f7 L7 z2 ^( ]
. x4 u5 h9 Z% o4 W% G& S }
: R5 S* b: Z; h& `2 H* L( o- O A& [/ z0 o7 v( P0 s q
} - N6 K8 j: _ P1 N% A7 @, B
上面这种方式会抛出如下异常:
# B6 @; O9 u. X5 v. i; B9 ^3 S" \8 N$ @$ u
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
; A6 i' A$ |- h9 d at java.util.ArrayList.RangeCheck(Unknown Source) " n" E+ o; A" r
at java.util.ArrayList.get(Unknown Source)
( |: C& N. ^- e5 g at ListDemo.main(ListDemo.java:20) 5 F* C1 \: `9 n
因为你删除了元素,但是未改变迭代的下标,这样当迭代到最后一个的时候就会抛异常咯。
( U, [* c" `0 {. y& ^5 c8 K' v' ^- u. E$ V4 i1 t. s
可以对上面的程序进行如下改进:
3 ?6 l, y4 \& |' h' D/ ]+ ? N. }- y
for(int i = 0 , len= list.size();i<len;++i){ : @; z$ F; _$ z) v
5 a& I! b: v" a/ J* w
if(list.get(i)==XXX){ 4 X+ H& J$ Q7 _4 `1 z8 \
s6 V4 h4 x* x list.remove(i);
; e- s- e" ]4 l7 T" x: N o0 R --len;//减少一个 U) a2 {) q8 K+ _! q2 P+ ]+ ~
}
1 i7 z" W2 b& ]( ~. K0 m7 Q6 h, M- N! X) g/ V( h- I! i) a9 ^& u
}
& J6 d; M- t, a上面的代码就正确了。
$ t0 T b% s9 T* M# U3 R" V% a: q: j" i3 s% ]7 t
下面我们再介绍一种方案:9 i, H3 x x; x {# c% u# [
9 Z4 t) [% S5 N% i
List接口内部实现了Iterator接口,提供开发者一个iterator()得到当前list对象的一个iterator对象。$ d1 K1 q9 x5 Z6 C
% C1 b& q! Z* _Iterator<String> sListIterator = list.iterator();
5 S0 v2 s. c: g/ l3 y$ `( owhile(sListIterator.hasNext()){
* L# h4 f7 ?5 ?3 M) C' s String e = sListIterator.next(); 8 b$ r: c! W$ [( U5 m7 i
if(e.equals("3")){
5 D) I7 T: A ~& Z- c sListIterator.remove();
" b |& A- }* a7 V# @ } $ j; R$ y# i& M; O. }
} 9 h6 L0 O% D+ ~
上面这种也是正确的,并推荐使用第二种方案。
; i* F/ T- t) R6 r+ h9 ], r" w+ F2 v2 G5 ~
两种方案实现原理都差多的,第二种只是jdk封装了下。7 j7 g$ l2 u, w% L* D3 ]
F6 T. V& ~& }5 @4 J. r3 Z查看ArrayList源码会发现很多方法内部都是基于iterator接口实现的,所以推荐使用第二种方案。5 ?. _- }8 c, ?, g
9 B2 b6 J2 V* g |
|