]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(迭代器)的用法及其背後機制的探究
- 一個關於wait/notify與鎖關係的探究AI
- Vue原始碼探究-核心類的實現Vue原始碼
- 類與類之間的基本關係
- c++類與類的聚合(Aggregation)關係C++
- BlockingQueue介面及其實現類的原始碼分析BloC原始碼
- gin 原始碼閱讀(1) - gin 與 net/http 的關係原始碼HTTP
- Java容器類原始碼分析之Iterator與ListIterator迭代器(基於JDK8)Java原始碼JDK
- Java中類與物件的關係與區別Java物件
- 集合原始碼分析[1]-Collection 原始碼分析原始碼
- SAP Business Technology Platform 上 Roles,Roles collection 和 Scopes 的關聯關係Platform
- 五分鐘看懂UML類圖與類的關係詳解
- 集合類關係
- Vue原始碼探究-類初始化函式詳情Vue原始碼函式
- python 類關聯關係Python
- Collection集合、List集合及其方法
- UML類圖--類之間的關係
- 客戶關係管理系統原始碼|CRM系統原始碼原始碼
- 【java】類之間的關係Java
- .Netcore HttpClient原始碼探究NetCoreHTTPclient原始碼
- 一文搞懂PV、UV、VV、IP及其關係與計算
- 集合------集合框架Collection/Iterator迭代器/增強for迴圈框架
- YYKit原始碼探究(五十四) —— NSDate分類之Date modify(二)原始碼
- 【Java X 原始碼剖析】Collection的原始碼分析-JDK1.8-仍在更新Java原始碼JDK
- 介面、抽象類、普通類之間的關係抽象
- 看原始碼1. ArrayList中的Iterator實現原始碼
- WiFiAp探究實錄--功能實現與原始碼分析WiFi原始碼
- 全新視角探究目標檢測與例項分割的互惠關係 | AAAI 2020AI
- kubernetes儲存類與PV與PVC關係及實踐
- 從原始碼探究JAVA的equals和==原始碼Java
- Vue原始碼探究-原始碼檔案組織Vue原始碼
- .NET Core HttpClient原始碼探究HTTPclient原始碼
- .Net Core Configuration原始碼探究原始碼
- .NET Core Session原始碼探究Session原始碼
- Mybatis日誌原始碼探究MyBatis原始碼
- Proxy.newProxyInstance原始碼探究原始碼
- Java集合原始碼探究~ListJava原始碼
- GNU與Linux 的關係Linux
- Scala與Java的關係Java