目录
一. 前言
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。

二. 实现类
2.1. ArrayList
ArrayList底层是用数组实现的。可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。
ArrayList源码解析请参考《ArrayList 源码解析(JDK1.8)》。
2.2. LinkedList
LinkedList底层是通过双向链表实现的。所以,LinkedList和ArrayList之间的区别主要就是数组和链表的区别。
LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。同时,LinkedList还实现了Queue接口,所以他还提供了offer(), peek(), poll()等方法。
LinkedList源码解析请参考《LinkedList 源码解析(JDK1.8)》。
2.3. Vector
Vector和ArrayList一样,都是通过数组实现的,但是Vector是线程安全的。和ArrayList相比,其中的很多方法都通过同步(synchronized)处理来保证线程安全。如果你的程序不涉及到线程安全问题,那么使用ArrayList是更好的选择(因为Vector使用synchronized,必然会影响效率)。
二者之间还有一个区别,就是扩容策略不一样。在List被第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。
2.4. Stack
Stack是继承Vector,所以底层数据结构也是数组,只不过Stack它是按照栈的逻辑结构实现的,比如push方法在末尾压入一个元素和pop方法就是弹出最后一个元素,search方法也是从后往前查找,这些都是因为栈的特性是后入先出,有一点要注意Stack继承了Vector所以也不是严格上的栈,它能调用Vector的方法直接在中间去插入或者删除一个元素。
2.5. CopyOnWriteArrayList
CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数组(快照)上进行的,也就是使用了写时复制策略。同时因为获取、修改、写入三步操作并不是原子性的,所以在增删改的过程中都使用了独占锁,来保证在某个时间只有一个线程能对list数组进行修改。
本文介绍了Java中的List接口的几个主要实现类:ArrayList基于数组实现,适合随机访问;LinkedList是双向链表,适合增删;Vector线程安全但效率较低;Stack是按栈逻辑操作的Vector;CopyOnWriteArrayList是线程安全的ArrayList变体,采用写时复制策略。





