本来想直接看 LinkedList 的代码,但是刚好看到它继承的抽象接口是 AbstractListSequentialList,于是先读读这个抽象类的代(注)码(释)。

类注释

①:This class provides a skeletal(骨架) implementation of the List interface to minimize the effort required to implement this interface backed by a "sequential access" data store (such as a linked list). For random access data (such as an array), AbstractList should be used in preference to this class.

①:这里第一句话和 AbstractList 的非常像,只是内容稍微有些区别,意思就是 AbstractListSequentialList 是为了顺序存取的实现类而存在的抽象类,它最大程度地减少了需要实现顺序访问数据存储接口需要的工作。

如果你需要的是随机访问数据,那么应该使用 AbstractList,而不是继承这个类。

②:This class is the opposite of the AbstractList class in the sense that it implements the "random access" methods (get(int index), set(int index, E element), add(int index, E element) and remove(int index)) on top of the list's list iterator, instead of the other way around.

②:AbstractSequentialListAbstractList功能正好相反,因为AbstractList 实现了随机访问方法,例如

  • get(int index) ---> 通过索引访问元素
  • set(int index, E element) ---> 将传入元素替换指定索引处的元素
  • add(int index, E element) ---> 在指定索引处添加元素,将原本索引处的元素(如果有)以及索引之后的元素全部右移一位。
  • remove(index) ---> 删除指定索引处的元素

【而 AbstractSequentialList特性的是顺序访问

AbstractList 通过 ListIterator 实现了这些功能,而不是相反。(这句话我没太懂是啥意思,这里的 other way around 不知道代表了什么。)

③:To implement a list the programmer needs only to extend this class and provide implementations for the listIterator and size methods. For an unmodifiable list, the programmer need only implement the list iterator's hasNext, next, hasPrevious, previous and index methods.
For a modifiable list the programmer should additionally implement the list iterator's set method. For a variable-size list the programmer should additionally implement the list iterator's remove and add methods.

③:这段描述也和 AbstractList 中的很相似,意思实现一个 List 只需要集成这个类并实现 ListIterator 以及 size 方法,如果要实现的子类是不可变的,则 ListIterator 只需要提供 向前向后遍历的方法 hasNext, next, hasPrevious, previous and index methods. 就可以。

而如果要实现一个可变 List,对于一个动态大小List 来说,需要实现 Iteratorsetaddremove 方法。

④:The programmer should generally provide a void (no argument) and collection constructor, as per the recommendation in the Collection interface specification.
This class is a member of the Java Collections Framework.

④:关于构造函数,还是根据 Collection 接口规范,要提供2个:

  • 一个无参构造函数
  • 一个参数是 Collection 的构造函数

关键点:

  1. AbstractSequentialList 的特性是顺序存取,这点与 AbstractList 的随机存取有着本质的区别,数据结构是其核心特性。

类结构

public abstract class AbstractSequentialList<E> extends AbstractList<E> {

}

可以看到,AbstractSequentialList 继承了 AbstractList,同时它自己的方法也并不复杂,就是最基础的迭代器与元素的增删改。

image-20201015180759920

总结:

AbstractSequentialList 类很简单,对于元素进行修改增删的方法都是通过迭代器完成,所以直接快进到其具体实现类 LinkedList

Q.E.D.

知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

最是人间留不住,曾是惊鸿照影来。