0%

列表循环问题

列表是Java中使用最多的数据结构之一,列表的循环也是经常会使用的操作,这是我最近在对列表循环的时候遇到的一个问题,在此记录下来。

问题代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class ArrayTest {
public static void main(String[] args) {
List<Character> list = new ArrayList<>();
list.add('a');
list.add('b');
list.add('c');
list.add('d');
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
list.remove(i);
}
System.out.println(list);
}
}

预期结果:

[a, b, c, d]

[]

实际结果:

[a, b, c, d]

[b, d]

根据逻辑来说,对列表进行循环,循环中移除每一个元素,看似是没有问题的,但是这里忽略了一个问题,那就是在移除元素的过程中,数组的大小其实已经变化了,实际上并没有遍历所有的元素,某些元素是被跳过了。

还有几个错误示范

1
2
3
for (Character character : list) {
list.remove(character);
}
1
2
3
4
5
Iterator<Character> iterator = list.iterator();
while (iterator.hasNext()) {
Character character = iterator.next();
list.remove(character);
}

这两种方式用来移除列表中的元素都是会抛出ConcurrentModificationException异常的,故不可取。

正确操作

应对这个问题,我们可以使用迭代器来实现列表的删除元素操作。

1
2
3
4
5
Iterator<Character> iterator = list.iterator();
while (iterator.hasNext()) {
iterator.next();
iterator.remove();
}

利用迭代器的iterator.remove()方法,我们就可以正常移除列表中的元素啦。