java迭代器

爲了從一個系列中生成連續的元素,咱們可使用java迭代器。這是對枚舉界面的改進。迭代器代替了從jdk 1.2開始的枚舉html

這是一個很好的實用程序集合。每一個集合都是獨一無二的,而且想象若是咱們必須在須要迭代的時候爲每一個集合寫本身的邏輯。相反,java強制一個集合來傳遞一個迭代器。java

這些漂亮的實用程序使java可愛,不是嗎?api

重要注意事項:oracle

  • 咱們只能在一個方向迭代
  • 迭代只能作一次。若是你完成了系列的完成。若是咱們須要從新迭代,咱們應該獲得一個新的迭代器。

沒有泛型的迭代器示例

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,咱們須要對其進行類型轉換。ide

 

使用泛型的迭代器示例

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
Tigerthis

看起來很簡單 因爲咱們正在使用各類泛型,因此沒有明確地引用迭代器。spa

可迭代和迭代器

爲了使對象能夠迭代,它須要發出一個Iterator對象。要執行此合同,將使用Iterator接口。它包含一個名爲iterator()的方法,它返回Iterator。所以,任何實現Iterable的類都將返回一個Iterator。code

public interface Collection <E> extends Iterable <E> {

例如採起任何集合。集合是表示一系列元素的容器的接口。每一個集合像ArrayList,Vector都實現了Collection等等迭代器。htm

  • Iterable的一個優勢是,當您實現Iterable時,那些對象得到了如下支持:每一個循環語法。

使用迭代器刪除元素

  • 迭代器有一個刪除方法,咱們能夠從底層對象中刪除元素。
  • 它刪除迭代器返回的最後一個元素。

迭代器和枚舉接口之間的區別

  1. 在迭代器中引入了remove()方法。使用這種方法,咱們能夠從咱們正在迭代的底層集合中刪除元素。
  2. 枚舉有兩種方法,兩種均可以在迭代器中使用。二者的方法名稱縮短。

ListIterator是一個更好的迭代器,它包含更多的實用方法,如獲取元素索引和向基礎對象添加元素。使用ListIterator,咱們能夠在兩個方向進行迭代。對象

ConcurrentModificationException的

看下面的代碼,它會引起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)
 

實現咱們本身的定製迭代器

咱們將建立本身的自定義類,並使其實現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:HorseLionTiger

相關文章
相關標籤/搜索