JDK源码Iterator与Iterable的实现与区别

Posted 征途黯然.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK源码Iterator与Iterable的实现与区别相关的知识,希望对你有一定的参考价值。

–本文前言–
    在介绍Iterator与Iterable接口之前,需要了解Iterator与Iterable接口在Java类库家族谱中的地位。如下图0-1所示。
    【版权声明】归CSDN账户[征途黯然.]/公众号[三黄工作室]原创,禁止任何网站与个人采集或转载。

在这里插入图片描述


一、Iterable接口的地位

    如图0-1所示,Iterable接口是ListSetCollection的最高父类接口。

    而iterator为Java中的迭代器对象,是能够对List这样的集合进行迭代遍历的底层依赖。iterable接口里定义了返回iterator的方法,相当于对iterator的封装,同时实现了iterable接口的类可以支持forEach循环。

综上:
1.Iterable接口是各Java类集框架的最高级接口;
2.iterator接口作为Iterable接口中一个方法的返回类型。


二、iterator接口的内部方法

public interface Iterator<E> {
	//如果仍有元素可以迭代,则返回 true。
	boolean hasNext();
	
	//返回迭代的下一个元素。
	E next();
	
	//对迭代器剩下还未迭代的元素遍历,用lamda表达式。
	default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
    
}

    Iterator是一个“迭代器”的概念,无论是在javascript语言Java语言或是jQuery框架都是一种底层支撑,Iterator迭代器中的方法类似数据库查询结果对象中的“游标”。

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

    判断“迭代器”对象中,是否有下一个元素可以迭代。

	//返回迭代的下一个元素。
	E next();

    返回“迭代器”对象中的下一个元素。

  //对迭代器剩下还未迭代的元素遍历,用lamda表达式。
  default void forEachRemaining(Consumer<? super E> action) {
      Objects.requireNonNull(action);
      while (hasNext())
          action.accept(next());
  }

    用lamda表达式对迭代器剩下还未迭代的元素遍历。用关键字default修饰接口中的方法,可以定义方法体。


三、iterable接口的内部方法

public interface Iterable<T> {

	//返回一个在一组 T 类型的元素上进行迭代的迭代器。
    Iterator<T> iterator();

	//用lamda表达式进行forEach遍历迭代器
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
}

    Iterable在方法中返回“迭代器”的Iterator对象。


四、Iterable与Iterator关系

为什么不直接把Iterator接口中的hasNext(),next()等方法放在Iterable接口中,其他类直接实现Iterable接口就可以了?JDK的写法是否是多此一举?

非也!

    原因是有些集合类可能不止一种遍历方式,实现了Iterable的类可以再实现多个Iterator内部类,例如LinkedList中的ListItrDescendingIterator两个内部类,就分别实现了双向遍历和逆序遍历。通过返回不同的Iterator实现不同的遍历方式,这样更加灵活。如果把两个接口合并,就没法返回不同的Iterator实现类了。


获取编程资源

如果需要获取编程资源,请扫描关注我的公众号:
在这里插入图片描述

以上是关于JDK源码Iterator与Iterable的实现与区别的主要内容,如果未能解决你的问题,请参考以下文章

Iterable与Collection源码学习

通过jdk8文档学习Iterator, Collection, Stream, Collector, List,

请问java中的Iterator和Iterable有些啥区别啊?

foreach的使用原理简单解析

Java8之Iterable接口

JDK1.8源码中的设计模式