使用迭代器刪除元素

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