天天看點

Java集合【4】-- iterable和Iterator的異同分析詳解

目錄

一、iterator介紹

二、iterable接口

三、為什麼有Iterator還需要Iterable

<code>iterator</code>接口,也是集合大家庭中的一員。和其他的<code>Map</code>和<code>Collection</code>接口不同,<code>iterator</code> 主要是為了友善周遊集合中的所有元素,用于疊代通路集合中的元素,相當于定義了周遊元素的規範,而另外的<code>Map</code>和<code>Collection</code>接口主要是定義了存儲元素的規範。

為什麼需要iterator接口?

首先,我們知道<code>iterator</code>接口是為了定義周遊集合的規範,也是一種抽象,把在不同集合的周遊方式抽象出來,這樣周遊的時候,就不需要知道不同集合的内部結構。

為什麼需要抽象?

假設沒有<code>iterator</code>接口,我們知道,周遊的時候隻能通過索引,比如

這樣一來,耦合程度比較高,如果使用的資料結構變了,就要換一種寫法,不利于維護已有的代碼。如果沒有<code>iterator</code>,那麼用戶端需要維護指針,相當于下放了權限,會造成一定程度的混亂。抽象則是把周遊功能抽取出來,交給<code>iterator</code>處理,用戶端處理集合的時候,交給更“專業”的它,it do it well.

<code>iterable</code>接口其實是java集合大家庭的最頂級的接口之一了,實作這個接口,可以視為擁有了擷取疊代器的能力。<code>Iterable</code>接口出現在JDK1.5,那個時候隻有<code>iterator()</code>方法,主要是定義了疊代集合内元素的規範。從字面的意思看,是指可以疊代的接口。

源碼如下:

從上面的源碼可以看出,<code>iterable</code>接口主要是為了擷取<code>iterator</code>,附帶了一個<code>foreach()</code>方法。

集合<code>Collection</code>、<code>List</code>、<code>Set</code>都是Iterable的實作類,它們及其他們的子類都可以使用foreach進行疊代。

我們看到<code>Iterator</code>其實已經有很多處理集合元素相關的方法了,為什麼還需要抽象一層呢?很多集合不直接實作<code>Iterator</code>接口,而是實作<code>Iterable</code>?

1.<code>Iterator</code>接口的核心方法next()或者hashNext(),previous()等,都是嚴重依賴于指針的,也就是疊代的目前的位置。如果Collection直接實作<code>Iterator</code>接口,那麼集合對象就擁有了指針的能力,内部不同方法傳遞,就會讓next()方法互相受到阻撓。隻有一個疊代位置,互相幹擾。

2.<code>Iterable</code> 每次擷取疊代器,就會傳回一個從頭開始的,不會和其他的疊代器互相影響。

3.這樣子也是解耦合的一種,有些集合不止有一個<code>Iterator</code>内部類,可能有兩個,比如<code>ArrayList</code>,<code>LinkedList</code>,可以擷取不同的<code>Iterator</code>執行不一樣的操作。

Java集合【4】-- iterable和Iterator的異同分析詳解

此文章僅代表自己(本菜鳥)學習積累記錄,或者學習筆記,如有侵權,請聯系作者删除。人無完人,文章也一樣,文筆稚嫩,在下不才,勿噴,如果有錯誤之處,還望指出,感激不盡~

技術之路不在一時,山高水長,縱使緩慢,馳而不息。

公衆号:秦懷雜貨店

Java集合【4】-- iterable和Iterator的異同分析詳解
上一篇: C#函數重載
下一篇: C#繼承