接口Iterator和接口Iterable的区别

遇到该问题的背景:java

  • Spark1.6运行时,返回Iterable的状况,如返回reslist;
  • 到了Spark2.0+须要返回Iterator(),如返回reslist.iterator()。
  • 借此机会,这里对Iteratable和Iterator接口作进一步了解。

首先要说明的是,迭代器要集合类库,须要Iterable和Iterator:sql

1.Iterable接口编程

  • 内置了iterator方法顺序遍历数据源返回值Iterator接口
  • jdk8增长了forEach方法返回void
  • jdk8增长了spliterator方法实现并行遍历数据源返回Spliterator接口,底层是Stream并行遍历(Stream.isParallel())的实现:这里涉及到trySplit()分割n次,数据源就被分红了2^n块
  • Set、List都要实现Iterable接口,基本上使用迭代器都要实现该接口

如下是Iterable的定义:数组

public interface Iterable<T> {
    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

Java基本数据类型包含8种:数据结构

  • 6种数字类型(4个整型long-64位/int-32位/short-16位/byte-8位、2个浮点型double-64位/float-32位)
  • 字符型char-16位
  • 布尔型boolean

Iterator和ListIterator主要区别有:app

  • ListIterator有add()方法,能够向List中添加对象;而Iterator不能
  • ListIterator和Iterator都有hasNext()和next()方法,能够实现顺序向后遍历。ListIterator有hasPrevious()和previous()方法,能够实现逆向(顺序向前)遍历。Iterator就不能够。
  • ListIterator能够定位当前的索引位置,nextIndex()和previousIndex()能够实现。Iterator 没有此功能。
  • 均可实现删除对象,可是ListIterator能够实现对象的修改,set()方法能够实现。Iterator仅能遍历,不能修改。由于ListIterator的这些功能,能够实现对LinkedList等List数据结构的操做。

2.Iterator接口编程语言

  • 出现 Iterator 是为了解决遍历集合时,避免咱们在操做集合的时候必需要根据集合内部结构来选择咱们应该如何遍历,所以把Iterator抽象出来

如下是Iterator的定义:工具

public interface Iterator<E> {
    boolean hasNext();

    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

Java类库:
是由一些包组成,这些包包含了相关类、接口和异常处理类性能

  • Java核心包:以Java开头,包含:java.lang 编程语言的基本类库、java.applet、java.awt、java.io、java.net、java.util 集合类+时间处理模式+日期时间工具等各种经常使用工具包、java.sql、java.test、java.security、java.beans、java.math、java.rmi
  • Java扩展包:以javax开头,包含:javax.accessibility、javax.naming.*、javax.swing.*

Java集合类库:ui

  • List和Set都是实现Collection接口(Collection实现了Iteratable接口),Map不是
  • List:LinkedList链表结构、ArrayList动态再分配的数组、Vector~Stack是同步的(同时操做回出现修改异常)
  • Set:HashSet默认大小是1六、TreeSet有序
  • Map:Hashtable(经过初始容量和加载因子来调整性能)、HashMap容许Key为空、TreeMap有序

我的理解:

  • 随着Spark的升级,不少方法直接返回Iterator便可。这里面会涉及到Spark的多个算子的返回类型变化
  • Iterable是java的超级接口,Iterable里面的Iterator()返回的是Iterator。
相关文章
相关标签/搜索