昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。3 [" a# S3 w( l+ k
AD:% l! s+ `' F& _. G) _* ?) j5 s
昨天一位项目组同事需要在ArrayList中删除所有不等于指定值的元素,但是她弄了很久,发现总是删得不完全。刚好我以前做过类似的功能,就告诉她是因为ArrayList删除元素后长度变小了,元素的索引也会跟着改变,但是迭代的下标没有跟着相应的改变的缘故。 4 j* t6 N5 R1 o$ ]2 k# N( k* [1 {7 g, n2 q' Z2 \, r. [3 l E1 x
将一些删除方法做一些总结: % V5 o E8 q5 h+ K% \- t - I# D' { p: W( B8 h! l3 ?: U/** / @( B0 D% I: L$ j7 V( S' k! c * 删除Arraylist中值为"c"的元素 ; i# M; N0 A& J* q# m1 z. ~ */ ( B+ X6 _$ g7 ~" z7 d. ] public static void main(String[] args) { * T8 w, O: t, }5 ]4 ? 5 X! J" Z2 b+ C8 { List<String> list = new ArrayList<String>(); 0 X% Z0 R0 w \' [. J: G6 N. C
* y7 J( M! ^* g0 r4 O. ^ //"c"在Arraylist不连续存储 ) f( {* _. V w% h4 M+ V /* 9 F" ] G9 m% B# ?1 ^ list.add("c"); + F0 |# _+ M- ^- R; n& U( y1 ` list.add("a"); ( ]& F$ ~2 |6 c1 i; D8 F list.add("c"); ) ?8 P' {6 y5 V3 }, t: m
list.add("b"); 0 ^4 ^) g+ u. A$ X7 A6 s list.add("c"); 7 w* m7 o2 W* v3 ]0 A! k
list.add("d"); 4 w$ j" _- c! [4 r list.add("c"); 9 G: b/ {0 z' Q; e
*/ . @2 @* ?0 Y, p1 y" `0 N
g+ Z- h" X# B //"c"在Arraylist有连续存储 " @$ V3 n$ }. L% y list.add("a"); ' Z c' L. X& B; u* r
list.add("c"); ! I) c+ ^1 Q6 ]0 k list.add("c"); & X# O5 b2 `' r! X2 u' a list.add("b"); ; H) B P0 q4 {* ?. u: f2 `
list.add("c"); . q- @/ \8 p" n+ k
list.add("c"); L8 R( Y) ?" {6 Y, _- |* G, y list.add("d"); / z/ S9 A: L+ b1 q/ [ list.add("c"); , ~" r" H9 t1 U: U* ]( t
* P$ y o' i- N" V2 F7 e1 G- C" l1 p- V: T
//删除Arraylist中值为"c"的元素 % {& [; W3 J8 d, y* V
! B& D0 Q. i& v4 W' g
//有可能不能全部删除 1 O6 y$ |+ Z$ k0 R7 \' E9 z" p6 I
//removeListElement1(list); 8 u: q0 h. r+ P7 S) q' M0 q* M* ?" Z
//能够正确删除 6 \/ b# {$ c. U% _" k //removeListElement2(list); 2 A2 ~9 Q' l; ^0 K) ^
& M& J q& ^ M! R. c# u) X) c- C- ` //能够正确删除 % d8 g: _: f7 M) x
//removeListElement3(list); , d; [5 n. j( n } 3 I, J7 H) B& `% b
2 W' { i& M4 A1 M) }5 m
4 m1 v1 f! k9 U+ \& t E /** & H5 r2 D. j4 g0 A1 H
* 删除list中值为"c"的元素 2 K. V1 T. e" h% `) x * : i m' s q) F. |! k8 c
* 这种方式: $ m) d3 V. b) B% Z9 F$ G) o9 t/ N2 \
* 3 @3 V5 } o( E4 G' ?' N8 G * 当值为"c"的元素在Arraylist中不连续存储的时候,是可以把值为"c"的元素全部删掉 4 Y' {' G$ D; b
* 0 C2 W9 F8 o- w- h' y
* 但是当值为"c"的元素在Arraylist中有连续存储的时候,就没有把值为"c"的元素全部删除 $ [5 v; ^7 c) v) I
* 因为删除了元素,Arraylist的长度变小了,索引也会改变,但是迭代的下标没有跟着变小 ) h6 @# u) y1 T; g
*/ / Q* U( E2 I. G public static void removeListElement1(List<String> list) { 8 |! K. R4 j& t for(int i=0;i<list.size();i++) { ! H( w' P6 u- u) C if("c".equals(list.get(i))) { - _( l Z! v5 Q. C: A list.remove(i); 2 j2 O5 e0 k) |$ q/ k4 W7 W7 B5 D } ; }/ R6 a- z) g2 [1 L9 }" \4 T4 N3 g } & @) ?9 p& b. y/ t1 o3 y : V5 R! m% T+ v$ M- }/ r } * W! k5 H+ r3 b7 g
1 K5 {! x6 G7 N! ^/ g /** & o- f+ ?+ N. i5 ~; L [' O
* 删除Arraylist中值为"c"的元素 6 U( _( \) E; v [- V' V5 Z
* ; z7 M2 `( [' i- u; y/ h
* 这种方式: 4 U/ M& B( J2 \+ h% y, A7 g * % c; a- s) L l( B9 _
* 不管值为"c"的元素在Arraylist中是否连续,都可以把值为"c"的元素全部删除 : |8 B6 _$ V& v, R8 A, k */ 2 r4 T- b ]7 [) N+ Q1 D# v, n
public static void removeListElement2(List<String> list) { % U4 s% \7 U" N# g. ~5 Z for(int i=0;i<list.size();i++) { 9 y8 Q: i, w3 G( S% y
if("c".equals(list.get(i))) { / x8 E$ X8 g$ o+ Q# i8 c4 b list.remove(i); - Q$ ~- t, w! l; B* p+ d; ]
--i;//删除了元素,迭代的下标也跟着改变 $ K; a) E$ _, H
} , J8 W5 v% J' L1 t7 e, B
} $ D# ?4 g3 o' D# ^1 ?; Q } 1 [- u/ Q9 O4 {& g) z$ B- }
" Q6 u4 @& J H$ g /** & ^" v9 g5 Y: D: T, l# _ K
* 删除Arraylist中值为"c"的元素 , k0 @8 B; \5 S8 b" D
* : p9 x, c) \- {5 n% ~ * 这种方式: 7 {) B0 |# U: p * & a5 H, s0 d* p% z# {0 q * 不管值为"c"的元素在list中是否连续,都可以把值为"c"的元素全部删除 , t- X6 {0 b: Q% x * 1 R) {6 t9 z% J! Z7 o' D& L/ _
* 需保证没有其他线程同时在修改 / }2 g3 G/ m- d7 T/ ]. @% n* [ */ 5 F, K6 r8 a" r public static void removeListElement3(List<String> list) { 9 Y- }( D3 z! t' H! o- d# M
Iterator<String> iterator = list.iterator(); ; Q/ U; d2 D8 k; f3 D% [( q
while(iterator.hasNext()) { " _$ p+ s$ F0 O# z2 B! e4 g String str = iterator.next(); 7 m4 ?5 O- b5 x
if("c".equals(str)) { ( k+ {8 n5 u2 B, ~9 p5 x+ w iterator.remove(); $ ?$ Q3 a" f+ M3 Y
} U8 _7 ]* a* r, B& L! g0 ?" B- [3 D1 T8 B
} $ P/ m! d. V. t- S3 d7 x } $ F& O, }3 `4 D- e! u' T+ o1 A9 I) k2 R$ A