Java为什么不直接实现Iterator接口,而是实现Iterable?

createh53个月前 (02-01)技术教程14

Iterator和Iterable是Java集合框架中的两个核心接口,主要的作用就是集合元素的遍历操作,但是在Java中,Iterable接口和Iterator接口的用途有所不同,这也是为什么通常会实现Iterable接口而不是直接实现Iterator接口的原因,下面我们就来通过详细的分析来介绍一下二者的区别与联系。

概念介绍

Iterator接口

Iterator接口定义了遍历集合的标准方法,并且提供了一种逐个访问集合中元素的方式,这种方式不需要暴露集合的底层表示就可以实现集合的遍历。Iterator接口包含以下三个方法,源码如下所示。

public interface Iterator {
    boolean hasNext(); // 返回true,如果仍有元素可以迭代
    E next(); // 返回下一个元素
    void remove(); // 移除上一个返回的元素(可选操作)
}

Iterator接口用于实际的元素遍历。通过调用iterator()方法,一个Iterator对象会被返回,然后可以使用hasNext()和next()方法来迭代元素。

Iterable接口

Iterable接口定义表示了一个可以返回Iterator的集合操作。它是集合类的一个基本接口操作,使得集合可以在内部增强的for-each循环。在Iterable接口中包含一个方法,如下所示。

public interface Iterable {
    Iterator iterator(); // 返回一个迭代器
}

增强的for-each循环,如下所示

for (Element e : iterableCollection) {
    // 使用元素e
}

实现了Iterable接口的类可以返回一个Iterator的迭代器对象对象,通过这个迭代器对象可以来遍历其内部的元素。

为什么实现Iterable接口?

增强的for-each循环

实现Iterable接口,一个重要的目的就是为了利用该类来增强的for-each循环操作,通过这种增强操作可以快速高效的实现集合对象的遍历。

职责分离

Iterable接口和Iterator接口的职责是不同的,其中Iterable接口表示一个集合,其可以产生一个Iterator对象;而Iterator接口表示遍历集合的一个具体实现。

而实现Iterable接口意味着类表示一个可以被遍历的集合,而实现Iterator接口则表示类自身是遍历行为的实现,这在程序设计上是不合适的。

多次遍历

通过实现Iterable接口,使得每次调用iterator()方法都可以返回一个新的Iterator对象,这样就可以多次遍历集合对象。

而如果一个类类本身实现了Iterator接口,那么它可能无法支持多次遍历,因为Iterator通常是一次性使用的,遍历一次之后就结束了。

实现示例

实现Iterable接口

import java.util.Iterator;

public class MyCollection implements Iterable {
    private T[] items;
    private int size;

    public MyCollection(T[] items) {
        this.items = items;
        this.size = items.length;
    }

    @Override
    public Iterator iterator() {
        return new MyIterator();
    }

    private class MyIterator implements Iterator {
        private int index = 0;

        @Override
        public boolean hasNext() {
            return index < size;
        }

        @Override
        public T next() {
            if (!hasNext()) {
                throw new IllegalStateException();
            }
            return items[index++];
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException();
        }
    }
}

接下来就是看如何使用这个类了,如下所示。

public class Main {
    public static void main(String[] args) {
        MyCollection collection = new MyCollection<>(new String[] {"A", "B", "C"});
        for (String item : collection) {
            System.out.println(item);
        }
    }
}

通过这种方式,MyCollection类实现了Iterable接口,可以生成一个Iterator对象,从而支持增强的for-each循环和多次遍历。

总结

通过上面的介绍,我们也了解了,通过实现Iterable接口,类可以在增强的for-each循环中使用,而Iterator接口用于实际的元素遍历,所以这也就是Java为什么不直接实现Iterator接口,而是实现Iterable接口的原因。

相关文章

Java接口讲解!什么是Java接口?Java接口的特点是什么?

#懂编程就意味着很牛吗?#这篇文章好程序员来讲讲Java接口先关内容!一、 什么是接口?接口是用关键词interface来声明的,我们知道类的声明是用class。Java接口是一系列方法的声明,是一些...

Java 中那些绕不开的内置接口——Comparable 和 Comparator

恰巧今天要介绍的两个Java 内置接口在名字上乍一看也有点让人分不清楚,他们是 Comparable 和 Comparator 接口。如果你英文还可以应该能猜出来两者的区别,这篇我会用一些示例给大家解...

说完 Java 的 Abstract 后再来说说接口 (interface )

如你对 Abstract 修饰的抽象类不是非常了解的话,请自行先考古下。这篇文章需要对 Java 定义过的抽象类有一些基本的了解才可以。抽象类和抽象方法用 Abstract 修饰的类,叫做抽象类,那么...

今天就来随便讲讲:Java 接口和抽象类的区别吧。(详解)

在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式、设计思想、设计原则编程实现的基础。下面就来讲讲二者的区别。什么是抽象类和接口? 区别在哪里?不同的编程语...

抽象类和接口(抽象类和接口的区别和相同点)

抽象类就像这个代码:在这个打印图形的例子当中,可以看到父类的 shape 方法并没有实际作用,主要的工作都由子类完成了,像这些没有实际工作的方法,我们就可以把它设计成一个抽象方法,包含抽象方法的类叫做...

揭秘什么是面向接口编程(面向接口的好处)

先用一个案例来给大家说明一下面向接口编程。案例:有一个电脑类(Computer),电脑除了有基本的开机关机功能外,还有连接任何外接设备的功能,比如能电脑能连接外置键盘(Keyboard),鼠标(Mou...