大話Iterator

    我們做集合相關的內容時 必不可少的是會遇到 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沒有此功能。

ListIterator遍歷List

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());
        }
    }
}

ps:如有幫助請點贊 關注。有問題 想要獲取學習資料添加qq:1184905186

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章