ArrayList、Vector、LinkedList作为List的三个常用子类,为序列化一维数组提供了很好的保障。他们有共同点和各自的特点。依次分析。
介绍:
ArrayList:动态数组,从jdk1.2开始,array(数组)的升级版本,实现动态扩容,从而节省了一定的空间。
Vector:向量,自动增长数组,从jdk1.0就有
LinkedList:链表,利用类之间的引用关系,实现链式结构,jdk1.2开始。
特点
从ArrayList与Vector来谈:
- 这两个都是基于数组实现。
- Vector进行了方法的同步,从线程安全性上来看,Vector是线程安全的,而ArrayList不是。
- Vector和ArrayList的低层实现不同:
- 初始化策略:ArrayList在new的时候不初始化,而在第一次添加元素(add方法)的时候初始化数组大小。而Vector在new的时候就会初始化。(图ArrayList源码中add函数和Vector源码中构造方法)
- 扩容策略:ArrayList当装满了扩容1.5倍(图1),Vector默认扩容2倍(支持自定义capacityIncrement)(图2)
- 初始化策略:ArrayList在new的时候不初始化,而在第一次添加元素(add方法)的时候初始化数组大小。而Vector在new的时候就会初始化。(图ArrayList源码中add函数和Vector源码中构造方法)
- 两者进行增删改查的效率是差不多的,因为都是用数组结构实现。
谈谈LinkedList:
- 基于双向链表实现。
- 增删数据效率优于数组,因为数组要移动很多数据(移动n-index个数据)
- 改查数据,由于要移动指针,链表效率稍微低一点。
- 线程不安全,没有同步机制。
- 不存在扩容和初始化问题,链式结构。
总结一下:当增删操作、在指定位置插入删除的操作较多的时候,选择LinkedList。当查找元素、更改元素、在末端增加删除元素的操作多,而删除操作少的时候,ArrayList和Vector比较好。