Java集合源碼分析之Iterable概述_一點課堂(多岸學院)

前言

當咱們想要遍歷集合時,Java爲咱們提供了多種選擇,一般有如下三種寫法:java

  • 寫法1:for循環
for (int i = 0, len = strings.size(); i < len; i++) {
    System.out.println(strings.get(i));
}
  • 寫法2:foreach循環
for (String var : strings) {
    System.out.println(var);
}
  • 寫法3:Iterator
Iterator iterator = strings.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

那麼以上三種遍歷方式有何區別呢?for循環咱們很熟悉了,就是根據下標來獲取元素,這個特性與數組十分吻合,不熟悉的朋友能夠閱讀前面講解數組的文章。foreach則主要對相似鏈表的結構提供遍歷支持,鏈表沒有下標,因此使用for循環遍歷會大大下降性能。Iterator就是咱們今天要講述的主角,它實際上就是foreach數組

那麼,爲何集合能夠進行foreach遍歷,而咱們本身定義的Java對象卻不能夠呢?有沒有辦法讓任何對象都支持這種遍歷方式?下面的內容會告訴咱們答案。數據結構

Iterable

Iterable是迭代器的意思,做用是爲集合類提供for-each循環的支持。因爲使用for循環須要經過位置獲取元素,而這種獲取方式僅有數組支持,其餘許多數據結構,好比鏈表,只能經過查詢獲取數據,這會大大的下降效率。Iterable就可讓不一樣的集合類本身提供遍歷的最佳方式。oop

Iterable的文檔聲明僅有一句:性能

Implementing this interface allows an object to be the target of the "for-each loop" statement.學習

它的做用就是爲Java對象提供foreach循環,其主要方法是返回一個Iterator對象:this

Iterator<T> iterator();

也就是說,若是想讓一個Java對象支持foreach,只要實現Iterable接口,而後就能夠像集合那樣,經過Iterator iterator = strings.iterator()方式,或者使用foreach,進行遍歷了。code

Iterator

Iterator是foreach遍歷的主體,它的代碼實現以下:對象

// 判斷一個對象集合是否還有下一個元素
boolean hasNext();

// 獲取下一個元素
E next();

// 刪除最後一個元素。默認是不支持的,由於在不少狀況下其結果不可預測,好比數據集合在此時被修改
default void remove(){...}

// 主要將每一個元素做爲參數發給action來執行特定操做
default void forEachRemaining(Consumer<? super E> action){...}

Iterator還有一個子接口,是爲須要雙向遍歷數據時準備的,在後續分析ArrayListLinkedList時都會看到它。它主要增長了如下幾個方法:blog

// 是否有前一個元素
boolean hasPrevious();

// 獲取前一個元素
E previous();

// 獲取下一個元素的位置
int nextIndex();

// 獲取前一個元素的位置
int previousIndex();

// 添加一個元素
void add(E e);

// 替換當前元素值
void set(E e);

總結

在Java中有許多特性都是經過接口來實現的,foreach循環也是。foreach主要是解決for循環依賴下標的問題,爲高效遍歷更多的數據結構提供了支持。若是你清楚數組和鏈表的區別,應該就能夠回答如下問題了:

for與foreach有何區別,哪一個更高效?


【感謝您能看完,若是可以幫到您,麻煩點個贊~】

更多經驗技術歡迎前來共同窗習交流: 一點課堂-爲夢想而奮鬥的在線學習平臺 http://www.yidiankt.com/

![關注公衆號,回覆「1」免費領取-【java核心知識點】] file

QQ討論羣:616683098

QQ:3184402434

想要深刻學習的同窗們能夠加我QQ一塊兒學習討論~還有全套資源分享,經驗探討,等你哦! 在這裏插入圖片描述

相關文章
相關標籤/搜索