接口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。
相關文章
相關標籤/搜索