java迭代器

为了从一个系列中生成连续的元素,我们可以使用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,我们需要对其进行类型转换。

使用泛型的迭代器示例

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
看起来很简单 由于我们正在使用各种泛型,所以没有明确地引用迭代器。

可迭代和迭代器

为了使对象可以迭代,它需要发出一个Iterator对象。要执行此合同,将使用Iterator接口。它包含一个名为iterator()的方法,它返回Iterator。因此,任何实现Iterable的类都将返回一个Iterator。
public interface Collection <E> extends Iterable <E> {
例如采取任何集合。集合是表示一系列元素的容器的接口。每个集合像ArrayList,Vector都实现了Collection等等迭代器。

  • 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:
Horse
Lion
Tiger

欢迎加入学习交流群569772982,大家一起学习交流。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java 迭代器介绍 迭代器模式 迭代器模式是一个典型的设计模式,提供一种方法访问一个容器对象中各个元素,而又不暴...
    albon阅读 1,313评论 0 1
  • 迭代器(Iterator) 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解...
    文艺小年青阅读 328评论 0 1
  • 概念 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。 ...
    今晚打肉山阅读 331评论 0 0
  • Java中提供了很多集合类,这些集合类的数据结构不一样,因此在存储和遍历时的方式不一样。迭代器抽象出集合类的共有功...
    Andy_1777阅读 5,888评论 1 9
  • 在容器类中,需要取回其中的元素,但是,缺点就是:当使用容器,必须要对容器的确切类型编程。迭代器时一个对象,它...
    三木仔阅读 334评论 0 1