ArrayList删除元素陷阱
原创
©著作权归作者所有:来自51CTO博客作者摇滚侠的原创作品,请联系作者获取转载授权,否则将追究法律责任
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中,当其中一个元素被删除后,后面的元素会自动往前移动。所以当a1删除以后,a4移动到了下标0,但此时i已经为1,查询的是下标1的元素,此时下标1的元素是a2,所以a4被遗漏了。
解决办法:
当元素被删除时候,我们先i–,下次循环还从当前下标开始

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