ArrayList、LinkedList、Vector
2019-01-26 本文已影响0人
Ray昱成
从行为、结构、性能、安全等来分析。
行为
- 都实现了List接口,都是有序集合
- 都提供了根据位置索引进行查找、增加、删除
- 都提供迭代器进行遍历元素
- vector和ArrayList支持随机访问,而LinkedList需要遍历所有元素。
- sort内部实际都是调用Arrays.sort
- LinkedList同时实现了Deque,拥有队列的行为。
结构
- vector是线程安全的动态数组、ArrayList是常态动态数组
- LinkedList是双向链表
性能
- vector和ArrayList中数组默认长度都是10,元素数量超出需要扩容。而LinkedList新增元素与元素数据无关。
- vector中数组扩容提高一倍,而ArrayList是50%
- 由于数组在中间插入和删除元素需要重新移动元素,所以理论上在中间增删数据没有LikedList高效。
安全
Vector内部对所有方法都加上了锁,所以是线程安全的。其余两个线程不安全
关于Arrays.sort
- 对于原始数据类型,目前使用的是所谓双轴快速排序(Dual-Pivot QuickSort),是一种改进的快速排序算法
- 对于对象数据类型,目前则是使用TimSort,思想上也是一种归并和二分插入排序(binarySort)结合的优化排序算法。它的思路是查找数据集中已经排好序的分区,然后合并这些分区来达到排序的目的
- Java 8 引入了并行排序算法(直接使用 parallelSort 方法),适合处理大数据集。不过当数据集小于1 << 13时,其实还是调用的TimeSort。