Iterator 是所有 Collection 類(List、Set….)們都可以使用的迭代器,而 ListIterator 則是專門為 List 類所設計的迭代器
Iterator 只支持 hasNext()
、next()
、remove()
三種操作,而 ListIterator 除了原本的 3 種之外,還支持了更多操作
//Iterator接口
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
//ListIterator接口
public interface ListIterator<E> extends Iterator<E> {
//繼承自Iterator的接口
boolean hasNext(); //後面是否有元素
E next(); //游標向後移動,取得後面的元素
void remove(); //刪除最後一個返回的元素
//ListIterator新增的接口
boolean hasPrevious(); //前面是否有元素
E previous(); //游標往前移動,取得前面的元素
int previousIndex(); //取得游標前的index
int nextIndex(); //取得游標後的index
void set(E e); //將當前元素改設成e
void add(E e); //增加一個元素
}
Iterator 和 ListIterator 的差別
iterator()
方法在所有集合類中都能使用,但是 listIterator()
只有 List 類能用remove()
元素,而 ListIterator 可以 add()
、set()
、remove()
next()
順序的向後遍歷,ListIterator 則向前 previous()
和向後 next()
遍歷都可以
nextIndex()
和 previousIndex()
取得當前游標位置的前後 index 位置,Iterator 沒有此功能如果想在遍歷 List 時邊做刪除,用 Iterator 和 ListIterator 都能辦到,但如果是想在遍歷 List 時 add 元素,則只能使用 ListIterator 去做,因為 Iterator 是不提供此接口的
要注意的是,邊遍歷 List 邊使用 Iterator 和 ListIterator 的 add()
、remove()
時,並不會影響當前 List 輸出結果,雖然他們修改的是同一個 List,但是迭代器故意將 add 和 remove 設計成就算執行了,也不影響當前迭代器的輸出結果
public class Main {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
ListIterator<Integer> it = list.listIterator();
while (it.hasNext()) {
Integer x = it.next();
System.out.println(x);
//雖然使用it.add(100)去新增一個元素,使得list實際儲存的是 [1,2,100,3]
//但是此處的遍歷仍然只顯示[1,2,3],這是迭代器故意這樣設計的
if (x == 2) {
it.add(100);
}
}
System.out.println("list: " + list);
}
}
1
2
3
list: [1, 2, 100, 3]
另外,雖然 ArrayList 和 LinkedList 都支持 ListIterator,但通常只有在使用 LinkedList 時才會搭配 ListIterator
add(index, E)
也能達到同樣的效率