参考资料
LinkedList/ArrayList
相同之处
(1)都直接或者间接继承了AbstractList、都支持以索引的方式操作元素
(2)都不必担心容量问题、ArrayList是通过动态数组来保存数据的、当容量不足时、数组会自动扩容、而LinkedList是以双向链表来保存数据的、不存在容量不足的问题
(3) 都是线程不安全的、一般用于单线程的环境下、要想在并发的环境下使用可以使用Collections工具类包装。不同之处
(1)ArrayList是通过动态数组来保存数据的、而LinkedList是以双向链表来保存数据的
(2)相对与ArrayList而言、LinkedList实现了Deque接口、Deque继承了Queue接口、同时LinkedList继承了AbstractSequencedList类、使得LinkedList在保留使用索引操作元素的功能的同时、也实现了双向链表所具有的功能、这就决定了LinkedList的特定
(3)对集合中元素进行不同的操作效率不同、LinkedList善于删除、添加元素、ArrayList善于查找元素。本质就是不同数据结构之间差异。
ArrayList/Vector
相同之处:
(1)都是继承AbstractList、拥有相同的方法的定义、
(2)内部都是以动态数组来存储、操作元素的、并且都可以自动扩容。不同之处:
(1) 线程安全:ArrayList是线程不安全的、适用于单线程的环境下、Vector是线程安全的、使用与多线程的环境下。
(2)构造方法:Vector比ArrayList多一个可以指定每次扩容多少的构造方法
(3) 扩容问题:每当动态数组元素达到上线时、ArrayList扩容为:“新的容量”=“(原始容量x3)/2 + 1”、 而Vector的容量增长与“增长系数有关”,若指定了“增长系数”,且“增长系数有效(即,大于0)”;那么,每次容量不足时,“新的容量”=“原始容量+增长系数”。若增长系数无效(即,小于/等于0),则“新的容量”=“原始容量 x 2”。
(4) 效率问题:因为Vector要同步方法、这个是要消耗资源的、所以效率会比较低下
(5)Vector为摆脱fail-fast机制、自己内部多提供了一种迭代方法Enumeration。
总结
1、当需要对集合进行大量的查询时、并且是单线程环境下使用ArrayList
2、当需要对集合进行大量添加、删除时、并且是单线程环境下使用LinkedList、
3、当多线程时、需要对集合进行大量的查询时、可以考虑使用Vector或者Stack、但是不建议、我们可以使用多次提到的Collections类包装。