List 源码分析笔记

时间:2022-03-02 16:47:15

List Class Diagram:

List 源码分析笔记

 

笔记一:

1、Iterable 接口只定义一个iterator()方法。

     Iterator 接口有hasNext, next, remove方法。

     ListIterator接口继承Iterator接口,增加了hasPrevicous,previous,nextIndex, previousIndex,add,set方法。

2、AbstractCollection中:

    (1)public <T> T[] toArray(T[] a) 方法: 如果数组a空间足够则将数据填充到a中,否则建立一个新的数组。

    (2)addAll方法中有一个add成功就返回true。

    (3)removeAll 方法中有个remove成功就返回true。

3、AbstractList:

    (1)SubList内部类底层依赖于list.  使用偏移量实现操作。Sublist,用户操作下标从0开始。

4、迭代器维护expectedModCount 变量与List的modCount进行比较,如果不一致则抛出ConcurrentModificationException异常。

   

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

笔记二:

5、List特性

    (1)有序,可重复,允许Null

    (2)Clone: 浅拷贝

6、ArrayList

   (1)存储结构: 数组

   (2)序列化:

         transient 修饰elementData[]

         ArrayList自己实现了writeObject 和ReadObject.在默认序列化的基础上,序列化list.size 和每一个元素。

   (3)ListIterator迭代器当前状态是指向next,当调用previous时,返回的是next.previous,此时lastReturned和next指向同一个元素。

7、LinkedList

   (1)存储结构:双向链表, 由一个header来引导,不存放实际信息。

   (2)序列化:transient修饰 header

                      LinkedList自己实现了writeObject 和ReadObject.在默认序列化的基础上,序列化list.size 和每一个元素。

   (3)ListIterator迭代器当前状态是指向next,当调用previous时,返回的是next.previous,此时lastReturned和next指向同一个元素。

8、CopyOnWriteArrayList

    CopyOnWriteArrayList是ArrayList的一个变形,继承了arraylist的特性,线程安全。在进行set, add, remove 等改变性操作时都会对整个数组进行复制并替换。

   (1)、适用于改变较少频繁读取的场景。

 (2)、迭代器是只读的,不能进行修改。

 (3)、在进行set,add,remove等改变性操作时会使用ReentranceLock进行加锁。