如果您在使用调用之前remove
包含(当前已注释掉),那么您将打印出与您删除的值不同的值。例如:System.out.println
拆除前:
0 - Foo
1 - Bar
2 - Baz
现在如果i
是一,我们会打电话remove(1)
,离开
0 - Foo
1 - Baz
...所以我们已经删除了 Bar
,然后我们会打印 Baz
然后你也不会检查Baz
,因为你会i
在再次测试之前增加到 2。
要正确执行此类操作,您应该使用如下循环:
for (Iterator<Offer> iterator = offers.iterator(); iterator.hasNext() ;) {
Offer offer = iterator.next();
if (offer.isSpecialOffer()) {
iterator.remove(); // Must remove using the iterator!
System.out.println(offer.isSpecialOffer() + ".." + offer.getName());
}
}
或者,如果您真的想使用索引,最好向后工作以避免出现问题:
for (int i = offers.size() - 1; i >= 0; i--) {
Offer offer = offers.get(i);
if (offer.isSpecialOffer()) {
offers.remove(i);
// Use offer, not offers.get(i)
System.out.println(offer.isSpecialOffer() + ".." + offer.getName());
}
}