java中使用for循环删除集合中元素的注意点

apozol

发布时间: 18-09-2511:56

场景:使用for循环删除集合中的指定元素

定义一个list集合,并添加数据:

List<String> list=new ArrayList<>();

list.add("b");

list.add("e")

list.add("b");

list.add("c");

需求:删除该集合中所有字符串为b的数据,代码如下:

for (int i = 0; i < list.size(); i++) {

if("b".equals(list.get(i))) {

list.remove(i);

}

}

运行结果如下图:

我们可以看到删除成功,看起来没有问题,下面我们更改一下集合中元素的顺序:

List<String> list=new ArrayList<>();

list.add("b");

list.add("b");

list.add("e");

list.add("c");

再次运行,运行结果如下:

奇怪的事情发生了,当删除相邻重复元素的时候只删除一个,这是什么原因呢?

ArrayList的底层结构是数组类型,数组这种数据结构的特点是删除其中某个元素时,后面的所有元素索引都会前移,此时for循环的指针却会下移,因此会略过下一个元素,解决方案是删除时将指针回调一次:

for (int i = 0; i < list.size(); i++) {

if("b".equals(list.get(i))) {

list.remove(i);

i--;

}

}

此时运行才会得到想要的结果。

备注:这个问题只会出现在使用for进行遍历的时候,使用迭代器来操作时,不会出现这种问题:

Iterator it=list.iterator();

while(it.hasNext()) {

if("b".equals(it.next())) {

it.remove();

}

}

运行正常。

举报/反馈