概述
之前,我们学完了List的基本内容了(ArrayList/LinkedList/Vector/Stack). 现在, 我们回过头来总结一下List.主要分为下面几个部分:
- List概括
- List的初始容量的增长方式(基于JDK1.8)
- List的使用场景
List概括
List框架图
List概括
- List是一个接口,继承了Collection接口,代表了有序的队列.
- AbstractList是一个抽象类,继承了AbstractCollection(它实现了Collection接口中除了iterator()和size()之外的方法).它实现了List中除get()、size()之外的接口方法, 对比AbstractCollection,AbstractList实现了Iterator().
- AbstractSequentialList是一个抽象类,它继承了AbstractList. AbstractSequentialList实现了”链表中,根据index索引值操作链表的全部方法“.
- ArrayList/LinkedList/Vector/Stack是List的4个实现类.
- Arraylist是一个数组队列,相当于动态数组. 随机访问效率高,随机插入/删除效率低;
- LinkedList是一个双向链表. 可以被用作堆栈/队列/双端队列进行操作. 随机访问效率低,随机插入/删除效率高;
- Vector是一个矢量队列,和ArrayList一样,是一个动态数组. 但是Vector是线程安全的, ArrayList是非线程安全的;
- Stack是栈, 继承于Vector, 特性是先进后出FILO.
List的初始容量的增长方式(基于JDK1.8)
由于Stack是继承Vector的,所以这里我们只列举ArrayList,LinkedList和Vector,Stack和Vector的初始容量和增长方式和Vector的完全一样.
List | 初始容量 | 增长系数 | 说明 |
---|---|---|---|
LinkedList | / | / | 没有容量概念,因为链表可以无限扩容 |
ArrayList | 0 | 第一次增加到默认容量10,后续增加为原来容量的1.5倍 | / |
Vector | 10 | 增长系数默认为0,增长double或增长指定的增长系数 | / |
List的使用场景
下面概括的说一下各个List的使用场景:
如果涉及到”栈”,”队列”,”链表”等操作,应该考虑用List.具体用哪个List,可参考下面的依据:
- 对于需要随机插入,随机删除元素的, 或者插入和删除元素比较频繁的, 考虑用LinkedList;
- 对于需要随机访问元素,对访问效率要求高的,考虑用ArrayList;
- 对于”单线程环境“或者”多线程环境中,但List操作只会被单个线程操作“, 此时应该用非同步的List,如ArrayList;
- 对于多线程环境, 且List可能被多个线程操作的,此时应该使用同步的List,比如Vector(其实Vector太古老了,有更优秀的List可以代替它,比如jdk中concurrent包下的copyOnWriteArrayList);
参考文档
- Java Platform SE 8 Docs