任何人都可以向我解释这个Java陷阱吗?

led*_*222 1 java collections

这个小小的烦恼导致我失去了一个小时的睡眠,我不明白为什么.

我有一个ArrayList数组,我想迭代并有条件地删除项目.这是我的第一次尝试:

for (int i = 0; i < array.size(); i++) {
   if (array.get(i) == conditionMet) array.remove(i);
}
Run Code Online (Sandbox Code Playgroud)

那没用.以下做了:

for (Iterator<T> i = array.iterator(); i.hasNext();) {
   if (i.next() == conditionMet) i.remove();
}
Run Code Online (Sandbox Code Playgroud)

为什么?

no.*_*ing 7

你没有具体说明它没有工作,但是当你遍历ArrayListfor循环当前索引处删除元素i,集合的大小和指数的后续元素,两者的变化这是你大概是什么没想到.

从以下文档ArrayList#remove(int index):

删除此列表中指定位置的元素.将任何后续元素向左移位(从索引中减去一个).