List Class Diagram:
笔记一:
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进行加锁。