190521-JDK之List遍历删除的几种使用姿势

文章目录
  1. I. List遍历删除
    1. 1. foreach
    2. 2. 普通for循环
    3. 3. 迭代方式
    4. 4. jdk8+ 流方式
  2. II. 其他
    1. 1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
    2. 2. 声明
    3. 3. 扫描关注

在实际的业务开发中,容器的遍历可以说是非常非常常见的场景了,遍历删除呢,用的机会也不会少,但你真的会用么

I. List遍历删除

对于列表,这里以ArrayList进行举例说明,下面给出几种经常会遇到的写法

首先初始化一个list数组

1
2
3
4
List<String> list = new ArrayList<>();
for (int i = 0; i < 20; i++) {
list.add(i + ">index");
}

1. foreach

这个属于我们最常见的foreach循环,在循环内部判断满足条件的直接删除

1
2
3
4
5
for (String id : list) {
if (id.contains("2")) {
list.remove(id);
}
}

上面这种写法导致的问题,很容易可以发现,因为上面代码跑完之后,堆栈就出来了

IMAGE

很典型的并发修改错误,在foreach循环中不允许删除,新增

2. 普通for循环

1
2
3
4
5
6
for (int index = 0; index < list.size(); index++) {
if (index % 5 == 0) {
list.remove(index);
}
}
System.out.println(list);

上面这种写法呢?我们希望把列表中,第0,5,10,15位置的元素干掉,正常执行,倒是不会报错,然而输出的结果却和我们的预期不一致

IMAGE

for循环中,另外一种写法可能更加常见,为了避免每次都访问 list.size() 方法,我可能提前用一个变量保存数组大小

1
2
3
4
5
6
7
8
int size = list.size();
for (int index = 0; index < size; index++) {
if (index % 5 == 0) {
list.remove(index);
} else {
System.out.print(list.get(index));
}
}

上面这个问题就很明显了,数组越界

3. 迭代方式

下面这种可以说是标准的迭代删除的写法了,基本上大多都是这么玩

1
2
3
4
5
6
7
8

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String tmp = iterator.next();
if (tmp.contains("2")) {
iterator.remove();
}
}

4. jdk8+ 流方式

jdk8+ 推荐下面这种写法,简洁明了

1
list.removeIf(s -> s.contains("3"));

II. 其他

1. 一灰灰Bloghttps://liuyueyi.github.io/hexblog

一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

2. 声明

尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激

3. 扫描关注

一灰灰blog

QrCode

知识星球

goals

# List

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×