arraylist删除和迭代器删除后的差异?

时间:2015-02-15 06:10:42

标签: java arraylist iterator

我正在看这段代码:

Iterator<String> itr = list1.iterator();
while(itr.hasNext()) {
if(list2.contains(itr.next())) 
itr.remove();
}

list1:a b c d list2:b c list1变成:a d

arraylist代码(不起作用)

for(int i = 0; i < list1.size(); i++) {
if(list2.contains(list1.get(i)) 
list1.remove(i);
} 

似乎iterator的remove方法与arraylist的不同,它会将每个后续元素移到左边,这样就不可能迭代和删除(如果你想删除的东西连续出现,它会错过它,我相信)。看文档并没有为我清除它。

谢谢你!

1 个答案:

答案 0 :(得分:2)

迭代器的remove方法和ArrayList的{​​{1}}方法都将元素移到左侧。不同之处在于,当您使用迭代器的remove方法时,迭代器remove中的代码知道如何解决问题,以便迭代器不会跳过任何元素。当您使用自己的整数索引并自己执行remove时,您必须自己管理整数索引。也就是说,你必须要知道,当元素被移动时,你需要修改索引,这样它就不会跳过任何元素。

例如,这将起作用:

remove

虽然我不喜欢在for(int i = 0; i < list1.size(); i++) { if(list2.contains(list1.get(i)) { list1.remove(i); i--; } } 循环中修改这样的索引变量的做法;因此,我只使用for循环代替:

while

但这是一个风格问题。

基本上,我认为迭代器的int i = 0; while (i < list1.size()) { if(list2.contains(list1.get(i)) { list1.remove(i); } else { i++; } } 方法做了类似的事情 - 即。它调用ArrayList remove,然后将索引备份为1。但是,我还没有看到实际来源。