昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。& m. k8 x& u6 u* u- G) _
AD:+ O' G+ V8 ?3 q, I* L" @
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。, P; z/ h! I4 Q+ s. P
2 l, Q0 x2 k/ J5 D* W3 \# U0 K
将一些删除方法做一些总结:1 t5 g; V; R: r9 o- _; ?+ V$ o
8 I% T7 u( R( e/** % I" C- A% c1 u( D2 U# W * 删除Arraylist中值为"c"的元素 $ r9 G' C) P* Y# q+ z0 Z# ~5 O
*/ 4 V& P& L" o6 M$ z& S2 V# V
public static void main(String[] args) { 5 h P+ Q4 W* a6 d
3 z7 l0 W' J2 m- E& y
List<String> list = new ArrayList<String>(); 5 p& G' f) e5 b0 ]/ w5 L: p
* d, P) Y3 l& {8 v/ s5 D8 F
//"c"在Arraylist不连续存储 8 L+ A X8 r" m# x5 S0 o. t) t /* $ t) q! h3 W. W, ?
list.add("c"); . }8 Q' b1 y- O- r; {
list.add("a"); . R$ T7 z/ y; ~' r- s# X' T* x7 V
list.add("c"); 7 ]- t* c; t7 n' R$ W
list.add("b"); # N/ L& {: Y: q) @& A0 `$ l
list.add("c"); 8 A8 u) _' f6 d list.add("d"); # p; ?0 ?& X) y" h) o$ X list.add("c"); 2 W0 L# Q. o6 ]$ J */ 8 b D6 f9 {4 x+ B: v8 i
8 _6 J9 r$ C! y //"c"在Arraylist有连续存储 2 b9 g$ L& K6 R, V5 e0 ^' _ list.add("a"); 4 I: Y/ C# e0 _ list.add("c"); 2 X' I# z5 P* `' [: m% z list.add("c"); - S# ^4 E7 e# t3 \0 X
list.add("b"); & E, v7 N4 T+ ]
list.add("c"); % G6 N0 C3 {& v; x7 {4 w list.add("c"); % [" g7 n9 F# G/ Z) a4 G7 v% @: Y
list.add("d"); ! j' O. Z: R) e/ d+ C' \6 v/ [ list.add("c"); : U% w5 O h, h$ ^ }4 g+ F6 f
9 R4 \0 ~0 M* f6 f# X
( Z) a M ^& h+ Z/ G
//删除Arraylist中值为"c"的元素 $ S# P$ Z5 k- m) P$ G4 r) [
: t/ ]1 a0 w; N4 i7 B //有可能不能全部删除 7 \! s8 [# l/ M; y. M1 S
//removeListElement1(list); 7 m. @% L) b# b& U9 T1 a3 N9 X9 {* s
' K. y1 }* o' J7 n& k5 i @: X0 x
//能够正确删除 / K0 B, u2 U7 t) M2 x( M6 o4 N //removeListElement2(list); 7 z3 @3 k i9 _- g, g2 n$ c 4 o/ U8 L4 O' ?# ^1 l //能够正确删除 ) Q& l- O! |. n. I# X. g: @ //removeListElement3(list); ( A, C9 X2 Y* ]) C: m% o
} 3 Y2 S0 N; w. B. m6 H6 {) Y
+ r' U# E; v0 Y5 e) N , f$ }' S# Q/ S8 J; k /** u0 n# [3 Y$ m z
* 删除list中值为"c"的元素 % d9 @2 n0 ^1 O" }% q+ `' ?! O- ?
* # k) S& L* P6 i" d% k: u
* 这种方式: * q$ M$ G# ~: s& L2 B0 P5 E * # ~6 s- R6 h) ?: b0 Q* i* ~ * 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉 & f6 M1 [, N, u/ z5 S0 S, ` * 7 }0 C6 G% Z/ i1 }; y9 K( M * 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 ! v$ C8 Q9 c' U# e$ p# b! _3 } r% R * 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 + b/ Q4 M$ f- _ _1 r1 M */ 9 w- I: j" M l
public static void removeListElement1(List<String> list) { ! L/ I4 U+ u8 c& p% ^ for(int i=0;i<list.size();i++) { ; s7 k: I- w, l1 U6 R
if("c".equals(list.get(i))) { 1 m# {: ]" [& Y8 h- l2 Q+ P* @
list.remove(i); # k! E6 r' L4 f- ] } & G" Q* F4 W) ?6 G/ |9 j: z+ I3 W } 1 u% j8 X9 v |2 d$ q
. B+ |, t' Q/ ~. ~; p
} 8 p: e, f& V" B2 d1 X( x! ~/ Q( a& I4 ~3 W" F! W4 h F
/** - H) Q( a+ f K" g+ M * 删除Arraylist中值为"c"的元素 ' E# w, D& O( v9 U% f; _8 u
* # q8 T9 g- A/ ^$ I" ~
* 这种方式: * a0 r1 g4 l' @3 ]7 ^ * ' X B$ v" S; o# L( K2 z5 |3 K& f1 K
* 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除 / l6 b+ X/ T) ?8 T. i7 t */ 2 P: S- V, E$ S8 v5 W public static void removeListElement2(List<String> list) { ) ~- P/ }/ z3 _. g5 n" f# U
for(int i=0;i<list.size();i++) { - p1 C; j5 e6 b- I if("c".equals(list.get(i))) { + u1 e# T" _6 V! \4 S7 n% n u list.remove(i); ' Y6 W1 n. r" p1 D --i;//删除了元素,迭代的下标也跟着改变 2 m$ [' N( v4 ?
} 7 ? u$ v, b$ Y1 Z' q
} " w! N" R a: l1 s8 X% P8 _ } ' ~6 a7 d! U) y& r0 U7 o2 w# |
0 |. f3 U* n3 D5 J0 N0 ` /** N+ S( _! p# @ }2 q
* 删除Arraylist中值为"c"的元素 + L. X8 u, ?: v% P+ r/ Z5 e: \
* + s% c! P1 U% h" `8 O
* 这种方式: . i) t. i# l* Z+ f2 W9 ~& g! q * : p/ G' K w7 I/ q$ i * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除 * A7 i7 ^6 ?3 k" E * , J8 o8 o! N5 ]$ a * 需保证没有其他线程同时在修改 0 W9 I+ f# i; A2 A& }5 D+ \ */ / {6 B; w$ o% h: i2 l c6 R public static void removeListElement3(List<String> list) { , q* P0 C7 i8 E b8 G6 s! P
Iterator<String> iterator = list.iterator(); i/ ]4 \5 e [8 I
while(iterator.hasNext()) { / E! @2 V! N! Q% a; L( Q/ U4 w6 c" f String str = iterator.next(); : ` m, Q, V0 P+ t4 J* M; [
if("c".equals(str)) { 6 g0 T0 G, e5 l* P4 f0 D
iterator.remove(); g5 Z- F% b, E, Q. f } , C5 F6 k7 \" [ [. V
: G( {7 W0 P+ b$ _& I
} 5 d Y& x3 |+ C: {
} / [! l3 w3 `6 u/ h. C