Java 如何优雅的在循环中删除元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 如何优雅的在循环中删除元素相关的知识,希望对你有一定的参考价值。


正确示例

1. 迭代器(推荐使用)

List<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list.add("2");

Iterator<String> iterator = list.iterator();
while (iterator.hasNext())
if("2".equals(iterator.next()))
iterator.remove();;


System.out.println("还剩余的元素:" + list);

2. for循环倒排删除(推荐使用)

List<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list.add("2");

for (int i = list.size() - 1; i >= 0; i--)
if("1".equals(list.get(i)))
list.remove(i);


System.out.println("还剩余的元素:" + list);

3. for循环删除(不推荐使用,代码语义性不强)

List<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list.add("2");

for (int i = 0; i < list.size(); i++)
if("1".equals(list.get(i)))
list.remove(i);
// 删除后重置下标,否则会漏删
i--;


System.out.println("还剩余的元素:" + list);

错误用法

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");

for (String item: list)
if("1".equals(item))
list.remove(item);


System.out.println("还剩余的元素:" + list);

上边执行没问题,把要删除的元素1改成2试试呢

或者用下边的list进行删除就会报错

List<String> list = new ArrayList<>();
list.add("1");
list.add("1");
list.add("2");

for (String item: list)
if("1".equals(item))
list.remove(item);


System.out.println("还剩余的元素:" + list);

如果集合中的元素唯一,也就是说只删除集合中符合条件的一个元素,以下用法也是没问题的

List<String> list = new ArrayList<>();
list.add("1");
list.add("2");
list.add("3");

for (String item: list)
if("3".equals(item))
list.remove(item);
// 只删除一个就跳出
break;


System.out.println("还剩余的元素:" + list);

总结:

【编码强制规约】在《阿里巴巴Java开发手册》中,针对集合操作,有一项规定:不要在 ​​foreach​​ 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁。


以上是关于Java 如何优雅的在循环中删除元素的主要内容,如果未能解决你的问题,请参考以下文章

java数组如何循环添加元素

Python 如何优雅的删除列表中的重复元素

如何使用 ES6 扩展运算符和剩余运算符从数组或对象中删除特定元素

漫画:去掉一个数,如何让剩余的数乘积最大?

如何优雅的在 Microsoft word中插入代码

如何批量删除list循环出来的值?