Iterator接口(迭代器)的使用


 

Iterator接口(迭代器)


 

前言

 

  • 在程序開發中,經常需要遍歷集合中的所有元素。針對這種需求,JDK專門提供了一個接口java.util.Iterator。Iterator接口也是Java集合中的一員,但它與Collection、Map接口有所不同,Collection接口與Map接口主要用於存儲元素,而Iterator主要用於迭代訪問(即遍歷)Collection中的元素
  • 因此Iterator對象也被稱為迭代器,使你能夠通過循環來得到或刪除集合的元素。ListIterator 繼承了Iterator,以允許雙向遍歷列表和修改元素。

原理

  • 在獲取迭代器的時候,會創建一個原集合的副本。同時會創建一個指針指向迭代器迭代集合的起始位置。
  • 即Collection集合元素的通用獲取方式。在取元素之前先要判斷集合中有沒有元素,如果有,就把這個元素取出來,繼續再判斷,如果還有就再取出出來。一直把集合中的所有元素全部取出。

02_迭代器的實現原理

 

 

 


方法 

  • 想要遍歷Collection集合(比如ArrayList<>),那么就要獲取該集合的迭代器完成迭代操作,下面具體介紹實現步驟:
  1. hasNext() :該方法會判斷集合對象是否還有下一個元素,如果已經是最后一個元素則返回false。如果仍有元素可以迭代,則返回 true。
  2. next():把迭代器的指向移到下一個位置,同時,該方法返回迭代的下一個元素。
  3. remove() 從迭代器指向的集合中移除迭代器返回的最后一個元素。

 


測試

gaoji.jihe.DemoIterator

/*
    java.util.Iterator接口:迭代器(對集合進行遍歷)
    有兩個常用的方法
        boolean hasNext() 如果仍有元素可以迭代,則返回 true。
            判斷集合中還有沒有下一個元素,有就返回true,沒有就返回false
        E next() 返回迭代的下一個元素。
            取出集合中的下一個元素
    Iterator是一個接口,我們無法直接使用,需要使用Iterator接口的實現類對象,獲取實現類的方式比較特殊
    Collection接口中有一個方法,叫iterator(),這個方法返回的就是迭代器的實現類對象
        Iterator<E> iterator() 返回在此 collection 的元素上進行迭代的迭代器。

    迭代器的使用步驟(重點):
        1.使用集合中的方法iterator()獲取迭代器的實現類對象,使用Iterator接口接收(多態)
        2.使用Iterator接口中的方法hasNext判斷還有沒有下一個元素
        3.使用Iterator接口中的方法next取出集合中的下一個元素
 */
public class DemoIterator {
    public static void main(String[] args) {
        //創建一個集合對象
        Collection<String> coll = new ArrayList<>();
        //往集合中添加元素
        coll.add("姚明");
        coll.add("科比");
        coll.add("麥迪");
        coll.add("詹姆斯");
        coll.add("艾弗森");

        /*
            1.使用集合中的方法iterator()獲取迭代器的實現類對象,使用Iterator接口接收(多態)
            注意:
                Iterator<E>接口也是有泛型的,迭代器的泛型跟着集合走,集合是什么泛型,迭代器就是什么泛型
         */
        //多態  接口            實現類對象
        Iterator<String> iterator = coll.iterator();


        /*
            發現使用迭代器取出集合中元素的代碼,是一個重復的過程
            所以我們可以使用循環優化
            不知道集合中有多少元素,使用while循環
            循環結束的條件,hasNext方法返回false
         */
        while (iterator.hasNext()) {
            String e = iterator.next();
            System.out.print(e + " ");//姚明 科比 麥迪 詹姆斯 艾弗森
        }

        System.out.println("maven默認編譯jdk版本1.5需要自己配置成1.8");

        for (Iterator<String> it2 = coll.iterator(); it2.hasNext(); ) {
            String e = it2.next();
            System.out.print(e + " ");//姚明 科比 麥迪 詹姆斯 艾弗森
        }

    }
}

 

maven需要自己配置成jdk1.8編譯 

    <!--maven默認編譯jdk版本1.5需要自己配置成1.8-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>  <!--版本2019年10月-->
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

 


 

增強for循環 

增強for循環:底層使用的也是迭代器,使用for循環的格式,簡化了迭代器的書寫
JDK1.5之后出現的新特性
Collection<E> extends Iterable<E>: 所有的單列集合都可以使用增強for
public interface Iterable<T>實現這個接口允許對象成為 "foreach" 語句的目標。
 
        
增強for循環:用來遍歷集合和數組

格式:
for(集合/數組的數據類型 變量名: 集合名/數組名){
sout(變量名);
}

public class Demo02Foreach {
    public static void main(String[] args) {
        demo02();
    }

    //使用增強for循環遍歷集合
    private static void demo02() {
        ArrayList<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");
        list.add("ddd");
        for(String s : list){
            System.out.println(s);
        }
    }

    //使用增強for循環遍歷數組
    private static void demo01() {
        int[] arr = {1,2,3,4,5};
        for(int i:arr){
            System.out.println(i);
        }
    }
}

 

=======================================

參考資料:

Iterator接口(迭代器)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM