ArrayList删除元素陷阱

假设给你一个list,让你删除其中包含a的元素。

import java.util.ArrayList;

public class ArrayListTest {

public static void main(String[] args) {

ArrayList list1 = new ArrayList();
list1.add("a1");
list1.add("a4");
list1.add("a2");
list1.add("b2");

//移除list1中包含a的元素
for(int i = 0; i < list1.size();i++) {
if(list1.get(i).toString().contains("a")) {
list1.remove(i);
}
}
System.out.println(list1.toString());

}

}

上面这段代码,我们遍历list,当发现元素包含a时,移除该元素,最后输出结果。

我们发现a4被遗漏了。

ArrayList删除元素陷阱_java

分析原因,我们发现,因为ArrayList中,当其中一个元素被删除后,后面的元素会自动往前移动。所以当a1删除以后,a4移动到了下标0,但此时i已经为1,查询的是下标1的元素,此时下标1的元素是a2,所以a4被遗漏了。

解决办法:

当元素被删除时候,我们先i–,下次循环还从当前下标开始

ArrayList删除元素陷阱_删除元素_02

如上图所示,在第17行我们增加了i–,查看输出结果,所有包含a的元素都被移除。