在Java中,当使用foreach循环遍历集合时,对集合调用remove是否合法?例如:
List<String> names = ....
for (String name : names) {
// Do something
names.remove(name).
}
作为附录,移除尚未迭代的项目是否合法?例如,
//Assume that the names list as duplicate entries
List<String> names = ....
for (String name : names) {
// Do something
while (names.remove(name));
}
“增强型for循环”的java设计是不向代码公开迭代器,但安全删除项的唯一方法是访问迭代器。所以在这种情况下,你得用老办法:
for(Iterator<String> i = names.iterator(); i.hasNext();) {
String name = i.next();
//Do Something
i.remove();
}
如果在实际代码中,增强的for循环确实值得这样做,那么您可以将这些项添加到临时集合中,并在循环之后调用列表上的removeAll。
EDIT(重编):不,在迭代时以iterator.remove()方法之外的任何方式更改列表都会导致问题。解决这个问题的唯一方法是使用CopyOnWriteArrayList,但这实际上是为了解决并发问题。
删除重复项最便宜的方法(就代码行数而言)是将列表转储到LinkedHashSet中(如果需要,再转储回list中)。这样可以在删除重复项的同时保留插入顺序。