看原始碼1. ArrayList中的Iterator實現
ArrayList的包裡面的關於 Iterator 的實現原始碼:
/**
* An optimized version of AbstractList.Itr
*/
private class Itr implements Iterator<E> {
int cursor; // 下一個元素的下標
int lastRet = -1; // 最後一個返回的下標,如果沒有,返回 -1
int expectedModCount = modCount;
Itr() {}//預設的無參構造方法
public boolean hasNext() {
return cursor != size;//cursor 未到達線性表的末尾
}
@SuppressWarnings("unchecked")
public E next() {//獲取 list 下一個元素
checkForComodification();//檢查是否有併發的執行緒對list進行修改
int i = cursor;
if (i >= size)
throw new NoSuchElementException();//越界查詢
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();//遇到來自其他執行緒的修改
cursor = i + 1;
return (E) elementData[lastRet = i];
}
public void remove() {//移除元素
if (lastRet < 0)
throw new IllegalStateException();//非法狀態異常
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;//修改線性表的大小
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
@Override
@SuppressWarnings("unchecked")
public void forEachRemaining(Consumer<? super E> consumer) {
Objects.requireNonNull(consumer);
final int size = ArrayList.this.size;
int i = cursor;
if (i >= size) {
return;
}
final Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length) {//檢查到併發執行緒的修改
throw new ConcurrentModificationException();
}
while (i != size && modCount == expectedModCount) {
consumer.accept((E) elementData[i++]);//遍歷線性表
}//在迭代的末尾更新一次,減少堆記憶體的寫入壓力
cursor = i;
lastRet = i - 1;
checkForComodification();
}
final void checkForComodification() {//檢查是否有併發執行緒的修改,如果有就丟擲異常
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
相關文章
- 小豹子帶你看原始碼:ArrayList原始碼
- Java 集合 ArrayList 原始碼分析(帶著問題看原始碼)Java原始碼
- 原始碼閱讀之ArrayList實現細節原始碼
- ArrayList原始碼剖析與程式碼實測原始碼
- Java 8 中 ArrayList 的變化原始碼分析Java原始碼
- ArrayList 原始碼分析原始碼
- [原始碼分析]ArrayList原始碼
- ArrayList原始碼分析原始碼
- ArrayList原始碼解析原始碼
- 從原始碼看Spring中IOC容器的實現(一):介面體系原始碼Spring
- 集合-ArrayList 原始碼解析原始碼
- ArrayList方法原始碼分析原始碼
- ArrayList-原始碼分析原始碼
- ArrayList原始碼(改)(查)原始碼
- Java——ArrayList原始碼解析Java原始碼
- 1、ArrayList原始碼解析原始碼
- 搞懂 Java ArrayList 原始碼Java原始碼
- 原始碼分析之ArrayList原始碼
- 集合原始碼分析[3]-ArrayList 原始碼分析原始碼
- Java集合原始碼剖析——ArrayList原始碼剖析Java原始碼
- 【Java集合原始碼剖析】ArrayList原始碼剖析Java原始碼
- [原始碼分析]ArrayList和LinkedList如何實現的?我看你還有機會!原始碼
- 原始碼解析.Net中DependencyInjection的實現原始碼
- Go 中的鎖原始碼實現:MutexGo原始碼Mutex
- 從原始碼看Spring中IOC容器的實現(二):IOC容器的初始化原始碼Spring
- ArrayList詳解-原始碼分析原始碼
- 手寫ArrayList核心原始碼原始碼
- 【Java集合】ArrayList原始碼分析Java原始碼
- ArrayList原始碼閱讀(增)原始碼
- 手寫 ArrayList 核心原始碼原始碼
- ArrayList & LinkedList原始碼解析原始碼
- JAVA集合:ArrayList原始碼分析Java原始碼
- jdk原始碼分析之ArrayListJDK原始碼
- Java容器原始碼學習--ArrayList原始碼分析Java原始碼
- ArrayList的簡單實現
- 相親交友原始碼中語音連麥的實現方式,值得一看原始碼
- 原始碼解析.Net中Middleware的實現原始碼
- Lru在Rust中的實現, 原始碼解析Rust原始碼