使用迭代器删除元素
Iterator.remove()
方法是一个可选方法,它删除上一次调用 Iterator.next()
返回的元素。例如,以下代码填充字符串列表,然后删除所有空字符串。
List<String> names = new ArrayList<>();
names.add("name 1");
names.add("name 2");
names.add("");
names.add("name 3");
names.add("");
System.out.println("Old Size : " + names.size());
Iterator<String> it = names.iterator();
while (it.hasNext()) {
String el = it.next();
if (el.equals("")) {
it.remove();
}
}
System.out.println("New Size : " + names.size());
输出:
Old Size : 5
New Size : 3
请注意,上面的代码是在迭代典型集合时删除元素的安全方法。相反,如果你尝试从集合中删除元素,请执行以下操作:
for (String el: names) {
if (el.equals("")) {
names.remove(el); // WRONG!
}
}
一个典型的集合(如 ArrayList
)为迭代器提供了失败的快速迭代器语义,它会抛出一个 ConcurrentModificationException
。
remove()
方法只能在 next()
调用之后调用(一次)。如果在调用 next()
之前调用它,或者如果在 next()
调用之后调用它,则 remove()
调用将抛出 IllegalStateException
。
remove
操作被描述为可选操作; 即并非所有迭代器都允许它。不支持它的示例包括不可变集合的迭代器,集合的只读视图或固定大小的集合。如果在迭代器不支持删除时调用 remove()
,它将抛出一个 UnsupportedOperationException
。