一:结构概览
二:特点分析
2.1 RandomAccess
高效随机访问标志接口。总所周知ArrayList底层采用数组结构实现,数组数据类型支持高效的随机访问,所以ArrayList实现RandomAccess标志性接口不存在任何问题。
2.2 Deque
双端队列接口,其父接口为队列接口Queue。所以从继承结构上分析LinkedList具备双向队列的API实现,至于其API具体实现则与底层数据结构双向链表有关。
三:结构职责
设计模式六大原则,单一职责、迪米特法则、开闭原则、依赖倒置原则、接口隔离原则、里氏替换原则
- Conllection中抽取了List与Set的公共基础实现,那么针对List所有实现子类都具备的下标操作是需要单独进行扩展,这样的设计满足接口隔离与单一职责原则
- 接口Collection、List分别具备抽象类实现AbstractCollection、AbstractList,但是具体实现子类ArrayList、LinkedList、Vectory都重新实现接口List重写相关方法实现。所以这里设计的优势没有读懂,以前粗略认为方便扩展,但是这个方便扩展应该怎么去解释
3.1 Collection与AbstractCollection
定义Collection集合公共基础方法,如元素添加add(),删除remove(),数量size()等等,最重要的是Collection继承了Iterable接口。也就是获取集合迭代器,具体的迭代器实现在子类中采取内部类实现Iterator接口的方式实现。如上图截取ArrayList中的实现
另外一点就是支持JDK1.8对于Stream流的新特性,Collection接口中定义了两个方法用于集合对象获取Stream流。其中parallelStream()获取的流为无限流
3.2 List与AbstractList
显而易见,Collection接口实现不仅仅是List,并且还有Set。Collection接口中提炼抽取出List与Set的公共基础设计,那么List与Set就需要分别对这两种集合实现进行特性扩展。上图展示了元素增加方法add()与addAll()的重载,针对List的插入有序性进行下标操作重载
3.3 ArrayList、LinkedList、Vector
三者都是List集合的具体实现类,其中ArrayList采用数组结构
、LinkedList采用双向链表结构
、Vector采用数组结构且线程安全
。三者就是使用其底层数据结构完成List集合操作实现,其操作皆可以划分为元素添加、删除以及元素存在判断、集合为空判断、元素个数统计、元素迭代这几方面操作。
共同特性:
- 插入有序
- 可重复
差异:
- ArrayList相较于LinkedList的高效随机访问
- LinkedList相较于ArrayList的高效结构变更
- Vector相较于ArrayList的线程安全,采用关键字Synchronized实现