天天看點

Java AbstractList 源代碼分析

AbstractList是一個抽象容器,其中有很多abstract方法便于子類實作。這個類主要實作了疊代器功能和定義了一系列容器的操作接口。

疊代器是一個内部類,這個内部類有三個字段:

int cursor = ;
int lastRet = -;
int expectedModCount = modCount;
           

第一個可以了解為遊标,用于辨別數組元素的第一個下标。

第二個也可以了解為遊标,但是如果這個元素不存在,那麼這個值就是-1.

第三個字段很重要,用于檢測元素數組是否被修改的判斷。如果數組在疊代過程中增加或删除,則可以直接檢查出來,導緻快速失敗。

看看使用最多的方法:

檢查是否還有下一個元素:

public boolean hasNext() {
            return cursor != size();
        }
           

判斷邏輯簡單粗暴,直接判斷遊标是否等于數組長度。如果等于,則沒有下一個元素,如果不等于,說明還沒有疊代到數組最後。

擷取下一個元素:

public E next() {
            checkForComodification();
            try {
                int i = cursor;
                E next = get(i);
                lastRet = i;
                cursor = i + ;
                return next;
            } catch (IndexOutOfBoundsException e) {
                checkForComodification();
                throw new NoSuchElementException();
            }
        }
           

這裡先擷取了遊标,然後直接取遊标對應的取值,然後傳回。

看看疊代器最重要的一個方法:檢查并發修改的内容。

final void checkForComodification() {
            if (modCount != expectedModCount)
                throw new ConcurrentModificationException();
        }
           

這個方法主要檢查了從疊代器構造完成後數組的容量和疊代以後數組的容量是否相等,如果不相等,說明有其他線程修改了數組長度,這裡會抛出一個ConcurrentModificationException同步修改異常,也就是經常說的快速失敗(fast fail)。

在java并發程式設計實踐中說,這種設計隻是善意提醒了這個容器存在多線程操作,因為這個容器目前隻支援單線程操作。當然,在這裡捕捉的容器長度并不精确。