我有点担心你在这里尝试做什么。任何时候有人想在不使用Iterator 的情况下循环从集合中删除项目时,警报通常会响起。
所以,回答问题如上所述:如果你改变你的循环不变量,那么你会得到一些时髦的行为。这就是为什么它通常被称为“不变量”的原因;你不想想要改变它。当然欢迎你,但你在这里玩火。
但是,假设我们有一个包含 5 个元素的列表,并且我们按原样执行您的代码。
List<String> stringList = Arrays.asList("word", "another word", "let's go", "keep it up", "get moving");
int length = stringList.size();
for(int i = 0; i < length; i++) {
System.out.println(stringList.remove(i));
length = stringList.size();
}
System.out.println("done");
如果您希望它打印出列表中的每个单词,请再考虑一下。它将跳过每个元素,因为我们在迭代列表时正在更改列表的内容。从 ArrayList 中删除元素时,底层实现会将元素移到删除它的左侧。因此,如果从位置 0 删除,每个元素现在都位于其原始位置的左侧(因此元素 1 现在是元素 0)。
快速浏览:
- 第一次迭代,
i = 0; "word" 被删除。大小更改为 4,i 增加为 1。
- 第二次迭代,
i = 1; "let's go" 被删除。大小更改为 3,i 增加为 2。
- 第三次迭代,
i = 2; "get moving" 被删除。 SIze 变为 2,i 变为 3。
- 由于条件不满足,不再进行迭代。
如果您想从集合中干净地删除 所有 项 将它们打印出来,那么 ArrayList#clear() 就是您要寻找的。如果您想一次删除一个元素,请改用Iterator:
List<String> stringList = new ArrayList<>(Arrays.asList("word", "another word", "let's go", "keep it up", "get moving"));
for(Iterator<String> stringIterator = stringList.iterator(); stringIterator.hasNext(); ) {
System.out.println(stringIterator.next());
stringIterator.remove();
}
System.out.println("done");