1. 程式人生 > >Iterator(迭代器)、增強for迴圈

Iterator(迭代器)、增強for迴圈

二、Iterator介面

三、Iterator的實現過程

四、迭代器的併發修改異常

五、增強的for迴圈

一、迭代器(Iterator)介紹

在java裡面有一個介面:Iterator。

java裡面有很多集合,每種集合元素儲存的方式不一樣,取的方式可能也不一樣。每一個都學習怎麼獲取很不現實,這時候就出現了迭代器,把所有的集合都搞成同樣的方式獲取。迭代器的好處就是,遮蔽掉了各種集合的不同。

Collection集合元素的通用獲取方式:取元素之前首先判斷集合中有沒有元素,如果有,就把元素取出來,如果還有,就繼續取出,直到取完。這種取出方式的專業術語就叫迭代。(說白了,就是遍歷)

迭代器:獲取集合中元素的一種方式。

二、Iterator介面

共有三個抽象方法,我們學習兩個:

1. boolean hasNext()                    //如果仍有元素可以迭代,則返回 true。

2. E next()                                     //獲取下一個元素。

因為Iterator是介面,所以應該找他的實現類。

介面Colletion中的iterator()方法,返回的就是在此 collection 的元素上進行迭代的迭代器。

ArrayList是Collection的實現類,重寫了iterator物件,返回的是Iterator介面的實現類的物件。

所以通過ArrayList的物件呼叫iterator()方法,方法的執行結果就是Iterator介面的實現類的物件。可以通過多型的方式接收一下。

這就是面向介面的程式設計。

例1:Iterator的使用

package cn.itcast.demo05;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<String>();
        coll.add("aaa");
        coll.add("bbb");
        
        Iterator<String> it = coll.iterator();    //多型。呼叫iterator方法獲取Iterator介面的實現類的物件。
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

例2:Collection<String>中的<String>可以不寫,這時集合什麼都可以存。如果不寫,Iterator<String>中的<String>也不能寫。

//Person.java

package cn.itcast.demo05;

public class Person {
    private String name;
    private int age;
    
    
    public Person(){}
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    public String toString(){
        return this.name +"--"+this.age;
    }
    
}

//Test.java

package cn.itcast.demo05;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        Collection coll = new ArrayList();      //不寫<String>,什麼都能存。   
        coll.add("aaa");
        coll.add(new Person("liu",23));        //既可以存字串,又能存Person物件。
        
        Iterator it = coll.iterator();                 //不寫<String>
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}

執行結果:

aaa
liu--23

三、Iterator的實現過程

當執行coll.iterator();時,會建立一個指標,指向-1的位置。

當執行it.hasNext()時,會判斷指標指的位置有沒有下一個元素。

當執行it.next()時,首先把下一個元素取出來,然後指標往後移動一位。只有執行next()時,指標才往後移動。

例如下面的例子:

           "aaa"   "bbb"  "ccc" 

     -1      0          1        2    

coll.iterator();                //初始化,指標指向-1

it.hasNext();                  //有下一個元素("aaa")

it.next();                        //返回"aaa",指標指向0

it.hasNext();                  //有下一個元素("bbb")

it.next();                        //返回"bbb",指標指向1

it.hasNext();                  //有下一個元素("ccc")

it.next();                        //返回"ccc",指標指向2

it.hasNext();                  //沒有下一個元素了。

四、迭代器的併發修改異常

在使用迭代器進行遍歷的時候,不允許修改集合的長度。否則會報:java.util.ConcurrentModificationException。不改長度是指不能進行增刪元素的操作,但是可以改元素。

例:對集合元素進行遍歷,當發現元素是"bbb"時,新增元素"eee"。下面的程式會報錯。

package cn.itcast.demo03;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class Test {
    public static void main(String[] args) {
        Collection<String> coll = new ArrayList<String>();
        coll.add("aaa");
        coll.add("bbb");
        coll.add("ccc");
        
        Iterator<String> it = coll.iterator();
        while(it.hasNext()){
            String s = it.next();
            if(s.equals("bbb")){
                coll.add("eee");                                      //當使用迭代器遍歷的時候,使用了add操作,改變了集合的長度。報錯。
            }
        }
       
    }
}


五、增強for迴圈

增強的for迴圈是jdk1.5新特性。

jdk1.5之後,出現了新的介面java.lang.Iterable,Collection開始繼承Iterable。而Iterable接口出現目的就是為了實現增強的for迴圈。

凡是見到的集合,還有陣列,都可以使用增強for迴圈。

格式:

for(資料型別 變數名: 陣列或集合){

         sop(變數);

}

好處:程式碼少

壞處:只能做遍歷用。沒有索引,不能操作容器裡面的數。

例1:增強for迴圈使用

package cn.itcast.demo06;

public class Test {
    public static void main(String[] args) {
        int[] arr = {1,22,3,4,5};
        for(int i:arr){
            System.out.println(i);
        }
    }
}

相關推薦

Iterator增強for迴圈

二、Iterator介面 三、Iterator的實現過程 四、迭代器的併發修改異常 五、增強的for迴圈 一、迭代器(It

scala陣列Scala Collection集合Iterator

一、scala陣列 陣列:用來儲存固定大小的同類型元素,通過索引來訪問指定元素,索引index從0開始 宣告陣列 定義陣列--語法格式: var z:Array[String] = new Array[String](3) 或 var z = new Array[St

Iterator的使用

最近使用Hibernate,在多對一對映中需要用到Set<T> 物件,為了把物件中的資料輸出,用到了Iterator物件。 Iterator是一個輕量級(建立代價很小)物件,它可以遍歷序列

C++之iterator學習

        迭代器是一種檢查容器內元素並便利元素的資料型別,迭代器可以很大程度上隔離容器底層實現,使用時只需依賴迭代器相對統一的方法/介面。Iterator類的訪問方式就是把不同集合類的訪問邏輯抽象出來,使得不用暴露集合內部的結構而達到迴圈遍歷集合的效果。  1 容器的I

Iterator的兩中使用方式for和while

方式一 for(Iterator<String> it = list.iterator();it.hasNext();){             System.out.println(it.next());             } 方式二 Iterato

Java之集合初探Iterator,collections,打包/解包裝箱拆箱,泛型(Generic),comparable接口

基本 generate 等於 框架 ring bin list() each 是否 Iterator(叠代器) 所有實現了Collection接口的容器都有一個iterator方法, 用來返回一個實現了Iterator接口的對象 Iterator對象稱作叠代器, 用來

Iterator 和generator

Oz http con code lan bubuko efi ati key 數組是可叠代的 var a = []; console.dir(a); 發現這裏有一個Symbol.iterator ,說明它是可叠代的。 object 是不可以叠代的 var a =

python初學一

一、迭代器的基本知識:       1、迭代器的建立:               (1)系統函式iter()           &nb

設計模式是什麼鬼講得形象化,圖形加助理解和記憶

文章出處:https://www.javazhiyin.com/tag/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F 作者:凸凹裡歐         方法迭代:代的更迭,從初代到末代的遍歷,指對某類集合中的每個元素按順序取出

1021 個位數統計 15 分

1021 個位數統計 (15 分) 給定一個 k 位整數 N=d​k−1​​10​k−1​​+⋯+d​1​​10​1​​+d​0​​ (0≤d​i​​≤9, i=0,⋯,k−1, d​k−1​​>0),請編寫程

1021 個位數統計 15 分

1021 個位數統計 (15 分) 給定一個 k 位整數 N=d​k−1​​10​k−1​​+⋯+d​1​​10​1​​+d​0​​ (0≤d​i​​≤9, i=0,⋯,k−1, d​k−1​​>0),請編寫程式統計每種不同的個位數字出現的次數。例如:給定 N=100

學習筆記 c++

迭代器 迭代器是演算法和容器的橋樑 迭代器用作訪問容器中的元素 演算法不直接操作容器中的資料,而是通過迭代器間接操作 演算法和容器獨立 增加新的演算法,無需影響容器的實現 增加新的容器,原有的演算法也能適用 輸入流迭代器和輸出流迭代器 輸入流迭代

設計模式

1 迭代模式 1.1能順序訪問聚合(一群物件)中的各個元素,而又不暴露其內部的表示 1.2 類圖 下面通過展現一個例子說明迭代模式,早餐選單的選單項是一個ArrayList型別,而午餐選單的選單項是一個數組型別,如果要遍歷他們,就得通過封裝遍歷。

python學習筆記10

可迭代物件與迭代器 可迭代物件: 可以直接作用於for迴圈的物件統稱為可迭代物件(Iterable)。可以用isinstance()去判斷一個物件是否是Iterable物件 可以直接作用於for迴圈的資料型別一般分兩種 1、集合資料型別,如list、tuple、dict、set、st

17 python 初學

生成器都是迭代器,迭代器不一定是生成器 迭代器滿足兩個條件: 1. 有iter方法 2. 有next方法 # list, tuple, dict, string: iterable(他們都有iter方法,所以都是可迭代物件) # 呼叫 iter 方法返回的 d 就是一個迭代器 # l

python學習簡單題目

迭代器練習題 Problem 1: Write an iterator class reverse_iter, that takes a list and iterates it from the reverse direction. 寫一個迭代器reverse_iter

(Java)集合框架Collection介面方法Iterator增強for迴圈

【Collection介面】  import java.util.ArrayList; import java.util.Collection; /* * Collection介面中的方法 是集合中所有實現類必須擁有的方法 * 程式演示,使用Collection

集合Iterator增強for迴圈泛型List介面Set介面

1、集合: 集合是java中提供的一種容器,可以用來儲存多個數據。 集合和陣列的區別:陣列的長度是固定的。集合的長度是可變的。集合中儲存的元素必須是引用型別資料 (1)ArrayList 集合儲存元素並遍歷 練習一:ArrayList集合儲存5個int型別元素 import java.util.Array

Python 之 雜談iter偏函式

1、 l = [1,2,3,'b',5,6] def func(): return l.pop() x = iter(func,'b') print(x.__next__()) print(x.__next__()) print(x.__next__()) 執行結果: 遇到“b

設計模式(一Iterator模式模式

Iterator模式(迭代器模式) 迭代器模式 需求 實現 修改後 迭代器模式 需求 一個實體類Book,一個Book的集合類 BookList,BookList提供遍歷方法。 實現 Book類