一个 ArrayList 的集合,删除部分指定的元素,看似一个很简单的需求,却很容易出现问题。
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25public class Test2 { @Test public void test() { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("B"); list.add("C"); list.add("A"); list.add("F"); list.add("B"); list.add("E"); System.out.println(list); for (int i = 0; i < list.size(); i++) { String s = list.get(i); if (StringUtils.equals(s,"B")) { list.remove(i); } } System.out.println(list); } } 控制台输出: [A, B, B, C, A, F, B, E] [A, B, C, A, F, E]
为什么 A 与 C 之间,两个 B,只有一个被移除了?
ArrayList底层用的是数组实现,当第一个 B 被移除后,数组长度由8变为了7,但 i 的值没有做相应的改变,导致第一 B 后的元素,没有参与校验,就向后执行了
优化方式 1:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26public class Test2 { @Test public void test() { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("B"); list.add("C"); list.add("A"); list.add("F"); list.add("B"); list.add("E"); System.out.println(list); for (int i = 0; i < list.size(); i++) { String s = list.get(i); if (StringUtils.equals(s,"B")) { list.remove(i); i--; } } System.out.println(list); } } 控制台输出: [A, B, B, C, A, F, B, E] [A, C, A, F, E]
优化方式 2:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22public class Test2 { @Test public void test() { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("B"); list.add("C"); list.add("A"); list.add("F"); list.add("B"); list.add("E"); System.out.println(list); for (int i = list.size() - 1; i >= 0; i--) { String s = list.get(i); if (StringUtils.equals(s,"B")) { list.remove(i); } } System.out.println(list); } }
优化方式 3:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25public class Test2 { @Test public void test() { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("B"); list.add("C"); list.add("A"); list.add("F"); list.add("B"); list.add("E"); System.out.println(list); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { if (StringUtils.equals(iterator.next(),"B")) { iterator.remove(); } } System.out.println(list); } } 控制台输出: [A, B, B, C, A, F, B, E] [A, C, A, F, E]
最后
以上就是飘逸洋葱最近收集整理的关于ArrayList 循环遍历并删除指定元素的全部内容,更多相关ArrayList内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复