首頁 > 軟體

Java深入分析Iterator迭代器與foreach迴圈的使用

2022-05-17 13:00:40

一、Iterator迭代器介面

1. 使用Iterator介面遍歷集合元素

Iterator物件稱為迭代器(設計模式的一種),主要用於遍歷 Collection 集合中的元素。

GOF給迭代器模式的定義為:提供一種方法存取一個容器(container)物件中各個元素,而又不需暴露該物件的內部細節。迭代器模式,就是為容器而生。類似於“公交車上的售票員”、“火車上的乘務員”、“空姐”。

Collection介面繼承了java.lang.Iterable介面,該介面有一個iterator()方法,那麼所有實現了Collection介面的集合類都有一個iterator()方法,用以返回一個實現了 Iterator介面的物件。

Iterator 僅用於遍歷集合,Iterator 本身並不提供承裝物件的能力。如果需要建立 Iterator物件,則必須有一個被迭代的集合。

集合物件每次呼叫iterator()方法都得到一個全新的迭代器物件,預設遊標都在集合 的第一個元素之前。

2. Iterator介面的方法

注意:在呼叫it.next()方法之前必須要呼叫it.hasNext()進行檢測。若不呼叫,且下一條記錄無效,直接呼叫it.next()會丟擲NoSuchElementException異常。

3. 迭代器的執行原理

3.1 程式碼演示

//hasNext():判斷是否還有下一個元素
while(iterator.hasNext()){
//next():①指標下移 ②將下移以後集合位置上的元素返回
System.out.println(iterator.next());
}

3.2 程式碼執行過程解析

當執行Iterator iterator = coll.iterator();語句時,iterator的指標此時執行下圖的①所標的位置,然後執行iterator.hasNext()語句,此時會去判斷iterator的指標指向的位置的下一個位置(即②)有無元素,若有,則返回true,否則返回false。當返回結果為true時,則往下執行 iterator.next()語句,此時iterator的指標下移並且把下移後的指標指向的集合位置上的元素返回。

4. Iterator介面remove()方法

4.1 程式碼演示

Iterator iter = coll.iterator();//回到起點
while(iter.hasNext()){
Object obj = iter.next();
if(obj.equals("Tom")){
iter.remove();
} }

4.2 注意

Iterator可以刪除集合的元素,但是是遍歷過程中通過迭代器物件的remove方法,不是集合物件的remove方法。

如果還未呼叫next()或在上一次呼叫 next() 方法之後已經呼叫了 remove 方法,再呼叫remove都會報IllegalStateException異常。

5. 程式碼演示

    @Test
    public void test1(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);
        Iterator iterator = coll.iterator();
        //方式一:
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        System.out.println(iterator.next());
//        //報異常:NoSuchElementException
//        System.out.println(iterator.next());

        //方式二:不推薦
//        for(int i = 0;i < coll.size();i++){
//            System.out.println(iterator.next());
//        }
        //方式三:推薦
        hasNext():判斷是否還有下一個元素
        while(iterator.hasNext()){
            //next():①指標下移 ②將下移以後集合位置上的元素返回
            System.out.println(iterator.next());
        }
    }
   @Test
    public void test2(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);
        //錯誤方式一:
//        Iterator iterator = coll.iterator();
//        while((iterator.next()) != null){
//            System.out.println(iterator.next());
//        }
        //錯誤方式二:
        //集合物件每次呼叫iterator()方法都得到一個全新的迭代器物件,預設遊標都在集合的第一個元素之前。
        while (coll.iterator().hasNext()){
            System.out.println(coll.iterator().next());
        }
    }
    //測試Iterator中的remove()
    //如果還未呼叫next()或在上一次呼叫 next 方法之後已經呼叫了 remove 方法,
    // 再呼叫remove都會報IllegalStateException。
 @Test
    public void test3(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);
        //刪除集合中"Tom"
        Iterator iterator = coll.iterator();
        while (iterator.hasNext()){
//            iterator.remove();
            Object obj = iterator.next();
            if("Tom".equals(obj)){
                iterator.remove();
//                iterator.remove();
            }
        }
        //遍歷集合
        iterator = coll.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }

二、foreach 迴圈

1. 概述

Java 5.0 提供了 foreach 迴圈迭代存取 Collection和陣列。

遍歷操作不需獲取Collection或陣列的長度,無需使用索引存取元素。

遍歷集合的底層呼叫Iterator完成操作。

foreach還可以用來遍歷陣列。

2. 語法解析

3. 程式碼演示

    @Test
    public void test1(){
        Collection coll = new ArrayList();
        coll.add(123);
        coll.add(456);
        coll.add(new Person("Jerry",20));
        coll.add(new String("Tom"));
        coll.add(false);
        //for(集合元素的型別 區域性變數 : 集合物件)
        //內部仍然呼叫了迭代器。
        for(Object obj : coll){
            System.out.println(obj);
        }
        //123
        //456
        //Person@621be5d1
        //Tom
        //false
    }
 @Test
    public void test2(){
        int[] arr = new int[]{1,2,3,4,5,6};
        //for(陣列元素的型別 區域性變數 : 陣列物件)
        for(int i : arr){
            System.out.println(i);
        }
        //1
        //2
        //3
        //4
        //5
        //6
    }

4. 易錯題

public class test {
    public static void main(String[] args) {
        String[] str = new String[5];
        for (String myStr : str) {
                myStr = "小老師ir";
                System.out.println(myStr);
        }
        //小老師ir
        //小老師ir
        //小老師ir
        //小老師ir
        //小老師ir
        for (int i = 0; i < str.length; i++) {
                System.out.println(str[i]);
        }
        //null
        //null
        //null
        //null
        //null
    }
}

到此這篇關於Java深入分析Iterator迭代器與foreach迴圈的使用的文章就介紹到這了,更多相關Java Iterator迭代器內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com