java原始碼學習-AbstractSequentialList
介紹
- Abstract(抽象類)Sequential(可序化)List(列表)
- 繼承了 列表抽象類AbstractList
- 是LinkedList的父類
類圖
屬性
無
方法
構造方法
protected AbstractSequentialList() {
}
迭代器
@Override
public Iterator<E> iterator() {
return listIterator();
}
@Override
public abstract ListIterator<E> listIterator(int index);
新增元素
// 新增 指定元素element 到 指定位置index,將 當前 處於該位置的元素(如果有的話)和 任何後續元素 移到右邊(新增一個到它們的索引)
@Override
public void add(int index, E element) {
try {
// 先獲取一個 指定位置開始的 迭代器,然後再進行新增
listIterator(index).add(element);
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
@Override
public boolean addAll(int index, Collection<? extends E> c) {
try {
boolean modified = false;
ListIterator<E> e1 = listIterator(index);
Iterator<? extends E> e2 = c.iterator();
while (e2.hasNext()) {
// 用獲取到的ListIterator 進行新增
e1.add(e2.next());
modified = true;
}
return modified;
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
獲取元素
@Override
public E get(int index) {
try {
return listIterator(index).next();
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
移除元素
@Override
public E remove(int index) {
try {
ListIterator<E> e = listIterator(index);
E outCast = e.next();
e.remove();
return outCast;
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
替換元素
@Override
public E set(int index, E element) {
try {
ListIterator<E> e = listIterator(index);
E oldVal = e.next();
e.set(element);
return oldVal;
} catch (NoSuchElementException exc) {
throw new IndexOutOfBoundsException("Index: "+index);
}
}
總結
- 想要實現一個 支援按次序訪問的 List,只需要繼承這個抽象類,然後把指定的抽象方法實現就好了。需要實現的方法有:size、listIterator。
- 如果要實現一個 不可修改 的 List,只需要實現Iterator的hasNext、next、hasPrevious、previous和index方法。
- 如果要實現一個 可修改 的 List,還需要額外實現Iterator的set的方法。
- 如果要實現一個 大小可變 的 List,還需要額外的實現Iterator的remove和add方法
- AbstractSequentialList 只支援迭代器按順序 訪問,不支援 RandomAccess,所以遍歷 AbstractSequentialList 的子類,使用for迴圈+get() 的效率 要 <= 迭代器遍歷
相關文章
- java原始碼學習-SpliteratorJava原始碼
- Java容器原始碼學習--ArrayList原始碼分析Java原始碼
- Java集合原始碼學習(4)HashSetJava原始碼
- Java集合原始碼學習(5)HashMapJava原始碼HashMap
- Java集合原始碼學習(2)ArrayListJava原始碼
- Java集合原始碼學習(3)LinkedListJava原始碼
- Java集合原始碼學習(1)介面Java原始碼
- JAVA集合:常見Set原始碼學習Java原始碼
- java.security.Provider 原始碼學習筆記JavaIDE原始碼筆記
- Java併發包原始碼學習系列:同步元件CountDownLatch原始碼解析Java原始碼元件CountDownLatch
- Java併發包原始碼學習系列:同步元件CyclicBarrier原始碼解析Java原始碼元件
- Java併發包原始碼學習系列:同步元件Semaphore原始碼解析Java原始碼元件
- 原始碼學習原始碼
- Java併發包原始碼學習系列:執行緒池ThreadPoolExecutor原始碼解析Java原始碼執行緒thread
- Java併發包原始碼學習系列:JDK1.8的ConcurrentHashMap原始碼解析Java原始碼JDKHashMap
- Java併發包原始碼學習系列:執行緒池ScheduledThreadPoolExecutor原始碼解析Java原始碼執行緒thread
- fishhook原始碼學習Hook原始碼
- MMKV原始碼學習原始碼
- vue原始碼學習Vue原始碼
- 【原始碼學習】ThreadLocal原始碼thread
- EventBus原始碼學習原始碼
- ObjectMapper原始碼學習ObjectAPP原始碼
- express原始碼學習Express原始碼
- go原始碼學習Go原始碼
- 學習HashMap原始碼HashMap原始碼
- Vue 原始碼學習(一)Vue原始碼
- Okio 框架原始碼學習框架原始碼
- jQuery原始碼學習之$()jQuery原始碼
- vue observer 原始碼學習VueServer原始碼
- 來聊聊原始碼學習原始碼
- 原始碼學習之EllipsizingTextView原始碼TextView
- EOS原始碼學習系列原始碼
- 精讀《原始碼學習》原始碼
- PHP 原始碼加密學習PHP原始碼加密
- Mybatis 原始碼學習(二)MyBatis原始碼
- 學習RadonDB原始碼(二)原始碼
- 學習RadonDB原始碼(一)原始碼
- Masonry 原始碼學習整理原始碼