java迭代器

為了從一個系列中生成連續(xù)的元素,我們可以使用java迭代器。這是對枚舉界面的改進。迭代器代替了 [從jdk 1.2開始]的枚舉這是一個很好的實用程序集合。
每個集合都是獨一無二的,并且想象如果我們必須在需要迭代的時候為每個集合寫自己的邏輯。相反,java強制一個集合來傳遞一個迭代器。這些漂亮的實用程序使java可愛,不是嗎?
重要注意事項:

  • 我們只能在一個方向迭代
  • 迭代只能做一次。

沒有泛型的迭代器示例

package com.javapapers;

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

public class ExampleIterator {

    public static void main(String args[]){
        ArrayList animal = new ArrayList();
        animal.add("Horse");
        animal.add("Lion");
        animal.add("Tiger");

        Iterator animalItr = animal.iterator();

        while(animalItr.hasNext()) {
            String animalObj = (String)animalItr.next();
            System.out.println(animalObj);
        }
    }

}

沒有泛型,Iterator返回Object,我們需要對其進行類型轉(zhuǎn)換。

使用泛型的迭代器示例

package com.javapapers;

import java.util.ArrayList;

public class ExampleIterator {

    public static void main(String args[]){
        ArrayList animal = new ArrayList();
        animal.add("Horse");
        animal.add("Lion");
        animal.add("Tiger");

        for(String animalObj : animal) {
            System.out.println(animalObj);
        }
    }

}

輸出:
Horse
Lion
Tiger
看起來很簡單 由于我們正在使用各種泛型,所以沒有明確地引用迭代器。

可迭代和迭代器

為了使對象可以迭代,它需要發(fā)出一個Iterator對象。要執(zhí)行此合同,將使用Iterator接口。它包含一個名為iterator()的方法,它返回Iterator。因此,任何實現(xiàn)Iterable的類都將返回一個Iterator。
public interface Collection <E> extends Iterable <E> {
例如采取任何集合。集合是表示一系列元素的容器的接口。每個集合像ArrayList,Vector都實現(xiàn)了Collection等等迭代器。

  • Iterable的一個優(yōu)點是,當您實現(xiàn)Iterable時,那些對象獲得了以下支持:每個循環(huán)語法。

使用迭代器刪除元素

  • 迭代器有一個刪除方法,我們可以從底層對象中刪除元素。
  • 它刪除迭代器返回的最后一個元素。

迭代器和枚舉接口之間的區(qū)別

1.在迭代器中引入了remove()方法。使用這種方法,我們可以從我們正在迭代的底層集合中刪除元素。
2.枚舉有兩種方法,兩種都可以在迭代器中使用。兩者的方法名稱縮短。
ListIterator是一個更好的迭代器,它包含更多的實用方法,如獲取元素索引和向基礎(chǔ)對象添加元素。使用ListIterator,我們可以在兩個方向進行迭代。

ConcurrentModificationException的

看下面的代碼,它會引發(fā)ConcurrentModificationException。當我們使用迭代器時,我們無法添加或移除元素到底層集合。

package com.javapapers;

import java.util.ArrayList;

public class ExampleIterator {

    public static void main(String args[]){
        ArrayList animal = new ArrayList();
        animal.add("Horse");
        animal.add("Lion");
        animal.add("Tiger");

        for(String animalObj : animal) {
            System.out.println(animalObj);
            animal.add("Hyena");
        }
    }
}

Output:
Horse
Exception in thread "main" java.util.ConcurrentModificationException
    at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    at java.util.ArrayList$Itr.next(Unknown Source)
    at com.javapapers.ExampleIterator.main(ExampleIterator.java:13)

實現(xiàn)我們自己的定制迭代器

我們將創(chuàng)建自己的自定義類,并使其實現(xiàn)Iterable,以便返回一個迭代器,我們可以使用它迭代元素。

package com.javapapers;

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

public class AnimalIterator<String> implements Iterator<Object> {

    private ArrayList<?> animal;
    private int position;

    public AnimalIterator(Animal animalBase) {
        this.animal = animalBase.getAnimal();
    }

    @Override
    public boolean hasNext() {
        if (position < animal.size())
            return true;
        else
            return false;
    }

    @Override
    public Object next() {
        Object aniObj = animal.get(position);
        position++;
        return aniObj;
    }

    @Override
    public void remove() {
        animal.remove(position);
    }

}
package com.javapapers;

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

public class Animal implements Iterable<String> {

    private ArrayList<String> animal = new ArrayList<String>();

    public Animal(ArrayList animal){
        this.animal = animal;
    }

    public ArrayList getAnimal() {
        return animal;
    }

    @Override
    public Iterator<String> iterator() {
        return new AnimalIterator(this);
    }

}
package com.javapapers;

import java.util.ArrayList;

public class TestIterator {

    public static void main(String args[]) {
        ArrayList<String> animalList = new ArrayList();
        animalList.add("Horse");
        animalList.add("Lion");
        animalList.add("Tiger");
        Animal animal = new Animal(animalList);
        for (String animalObj : animal) {
            System.out.println(animalObj);
        }
    }
}

Output:
Horse
Lion
Tiger

歡迎加入學(xué)習(xí)交流群569772982,大家一起學(xué)習(xí)交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Java 迭代器介紹 迭代器模式 迭代器模式是一個典型的設(shè)計模式,提供一種方法訪問一個容器對象中各個元素,而又不暴...
    albon閱讀 1,303評論 0 1
  • 迭代器(Iterator) 迭代器是一種設(shè)計模式,它是一個對象,它可以遍歷并選擇序列中的對象,而開發(fā)人員不需要了解...
    文藝小年青閱讀 326評論 0 1
  • 概念 迭代器模式(Iterator),提供一種方法順序訪問一個聚合對象中的各種元素,而又不暴露該對象的內(nèi)部表示。 ...
    今晚打肉山閱讀 331評論 0 0
  • Java中提供了很多集合類,這些集合類的數(shù)據(jù)結(jié)構(gòu)不一樣,因此在存儲和遍歷時的方式不一樣。迭代器抽象出集合類的共有功...
    Andy_1777閱讀 5,872評論 1 9
  • 在容器類中,需要取回其中的元素,但是,缺點就是:當使用容器,必須要對容器的確切類型編程。迭代器時一個對象,它...
    三木仔閱讀 334評論 0 1