我們做集合相關的内容時 必不可少的是會遇到 Iterator這個單詞 。今天我們來看一下它是什麼?
一.Iterator
- Iterator專門為周遊集合而生,集合并沒有提供專門的周遊的方法
- Iterator實際上疊代器設計模式的實作
- Iterator的常用方法
- boolean hasNext(): 判斷是否存在另一個可通路的元素
- Object next(): 傳回要通路的下一個元素
- void remove(): 删除上次通路傳回的對象。
- 哪些集合可以使用Iterator周遊
- 層次1:Collection、List、Set可以、Map不可以
- 層次2:提供iterator()方法的就可以将元素交給Iterator;
- 層次3:實作Iterable接口的集合類都可以使用疊代器周遊
- for-each循環和Iterator的聯系
- for-each循環(周遊集合)時,底層使用的是Iterator
- 凡是可以使用for-each循環(周遊的集合),肯定也可以使用Iterator進行周遊
- for-each循環和Iterator的差別
- for-each還能周遊數組,Iterator隻能周遊集合
- 使用for-each周遊集合時不能删除元素,會抛出異常ConcurrentModificationException使用Iterator周遊合時能删除元素
-
Iterator是一個接口,它的實作類在哪裡?
在相應的集合實作類中 ,比如在ArrayList中存在一個内部了Itr implements Iterator
-
為什麼Iterator不設計成一個類,而是一個接口
不同的集合類,底層結構不同,疊代的方式不同,是以提供一個接口,讓相應的實作類來實作
使用Iterator疊代集合
public class TestIterator {
public static void main(String[] args) {
//建立一個集合對象
ArrayList<Integer> list = new ArrayList<Integer>();
//向集合中添加分數
list.add(78);
list.add(80);
list.add(89);
System.out.println(list);
Iterator<Integer> it = list.iterator();
while(it.hasNext()){
int elem = it.next();
if(elem == 78){
//list.remove(new Integer(78));
it.remove();
}
//System.out.println(elem);
}
System.out.println(list);
// for(int elem:list){
// if(elem == 78){
// list.remove(new Integer(78));//
// }
// System.out.println(elem);
// }
}
}
- Iterator到底是怎麼工作的;不同集合的周遊有Iterator的不同的實作類完成,以Iterator周遊ArrayList為例進行說明
public Iterator<E> iterator() {
return new Itr();
}
private class Itr implements Iterator<E> {
int cursor;
int lastRet = -1;
public boolean hasNext() {
return cursor != size;
}
public E next() {
int i = cursor;
Object[] elementData = ArrayList.this.elementData;
cursor = i + 1;
return (E) elementData[lastRet = i];
}
}
二.ListIterator
- ListIterator和Iterator的關系
- public interface ListIterator extends Iterator
- 都可以周遊List
- ListIterator和Iterator的差別?
- 使用範圍不同
- Iterator可以應用于更多的集合,Set、List和這些集合的子類型。
- ListIterator隻能用于List及其子類型。
- 周遊順序不同
- Iterator隻能順序向後周遊; ListIterator還可以逆序向前周遊
- Iterator可以在周遊的過程中remove();ListIterator可以在周遊的過程中remove()、add()、set()
- ListIterator可以定位目前的索引位置,nextIndex()和previousIndex()可以實作。Iterator沒有此功能。
public class TestListIterator {
public static void main(String[] args) {
//建立一個集合對象
List<Integer> list = new ArrayList<Integer>();
//向集合中添加分數
list.add(78);
list.add(80);
list.add(89);
ListIterator<Integer> lit = list.listIterator();
while(lit.hasNext()){
lit.next();
}
while(lit.hasPrevious()){
int elem = lit.previous();
System.out.println(elem +" "+lit.nextIndex()
+" "+lit.previousIndex());
}
}
}