]Iterator原始碼探究及其與Collection類的關係
int sum = 0;
while (values.hasNext()) {
sum = sum + 1;
}
values.hasNext()始終為真,因為漏了next()方法,應該是遍歷的下標沒有往前移動,導致hasNext()始終返回真。正好週末,想看一下iterator的原始碼一探究竟。Iterator具體實現是什麼?與Colletion的關係是怎樣的?
Iterator是幾種常見集合資料結構都有的介面。
每一種集合類返回的Iterator具體型別可能不同,Array可能返回ArrayIterator,Set可能返回SetIterator,Tree可能返回TreeIterator,但是它們都實現了Iterator介面,因此,客戶端不關心到底是哪種Iterator,它只需要獲得這個Iterator介面即可。
首先
public interface Collection<E> extends Iterable<E>
而Iterable:
public interface Iterable<T> {
Iterator<T> iterator();
}
由此保證所有繼承了Collection的類都有Iterator介面。可以override實現具有自己特徵的Iterator。
下面以ArrayList為例:
其中AbstractCllection implements Collection介面:
public abstract class AbstractCollection<E> implements Collection<E>
從而AbstarctList擁有Iterator方法
在AbstractList中Iterator方法實現為:
public Iterator<E> iterator() {
return new Itr();
}
還有一個ListIterator 我理解是增強型的Itr 能提供向前向後兩種方向的遍歷
public ListIterator<E> listIterator() {
return listIterator(0);
}
Iterator方法實現其實是建立一個Itr類的例項
Itr類和listItr都是AbstractList的內部類
private class Itr implements Iterator<E>
Itr中實現了Iterator介面的 各個方法
比如
public boolean hasNext() {
return cursor != size();
}
其中cursor是int型 表示下標 明顯hasNext不改變下標位置
另外還看了其他集合類實現Iterator的方式,和ArrayList大同小異,如ArrayBlockingQueue實現的iterator
繼承關係:
可以發現實現方式也是返回一個Itr例項
Itr也是ArrayBlockingQueue的內部類,然後在Itr內部封裝了Iterator介面的各種方法實現。
由此可以看出各個集合類與iterator之間的關係,並且也可以通過原始碼看出哪些迭代器是執行緒間安全的。
相關文章
- Iterator(迭代器)的用法及其背後機制的探究
- vector和iterator及collection
- Vue原始碼探究-核心類的實現Vue原始碼
- 一個關於wait/notify與鎖關係的探究AI
- 類與類之間的基本關係
- Java中Collection和Iterator介面Java
- UML類圖與類的關係詳解
- apache與 tomcat 搭建https及其關係ApacheTomcatHTTP
- gin 原始碼閱讀(1) - gin 與 net/http 的關係原始碼HTTP
- 原始碼安全與開發企業的績效關係!原始碼
- Java容器類原始碼分析之Iterator與ListIterator迭代器(基於JDK8)Java原始碼JDK
- Java中類與物件的關係與區別Java物件
- BlockingQueue介面及其實現類的原始碼分析BloC原始碼
- c++類與類的聚合(Aggregation)關係C++
- 集合原始碼分析[1]-Collection 原始碼分析原始碼
- Java中類名與檔名的關係Java
- 淺談UML中類之間的五種關係及其在程式碼中的表現形式
- 電子支付與安全的關係及其經濟分析三(轉)
- 電子支付與安全的關係及其經濟分析二(轉)
- Vue原始碼探究-類初始化函式詳情Vue原始碼函式
- 五分鐘看懂UML類圖與類的關係詳解
- 類之間的關係
- archive log檔案大小與redo log檔案大小關係探究Hive
- 集合類關係
- 與if的關係
- Linus關於核心標頭檔案與核心原始碼關係的論述(轉)原始碼
- SAP Business Technology Platform 上 Roles,Roles collection 和 Scopes 的關聯關係Platform
- UML類圖--類之間的關係
- YYKit原始碼探究(五十四) —— NSDate分類之Date modify(二)原始碼
- 《STL原始碼剖析》-- stl_iterator.h原始碼
- 客戶關係管理系統原始碼|CRM系統原始碼原始碼
- Activity 的啟動模式 以及與AppManager類的關係模式APP
- 【java】類之間的關係Java
- 從原始碼探究JAVA的equals和==原始碼Java
- 【Java X 原始碼剖析】Collection的原始碼分析-JDK1.8-仍在更新Java原始碼JDK
- 一文搞懂PV、UV、VV、IP及其關係與計算
- 關聯關係與依賴關係的區別
- Vue原始碼探究-原始碼檔案組織Vue原始碼