java集合-List类
ArrayList
ArrayList内部使用数组实现
内部关键变量
1 | // 默认初始容量 |
构造方法
1 | /* |
扩容机制
如果使用无参构造创建List,在第一次扩容时如果如果期望容量小于10则会将容量设置为10
后续扩容newCapacity = oldCapacity + (oldCapacity >> 1)
也就是说每次扩容后大小是原数组大小的1.5倍
RandomAccess
ArrayList实现了RandomAccess接口,实际上RandomAccess内部并无需要实现的方法
此接口只是为了标识该列表支持随机访问,也就是支持按下标访问
主要用于Collections.binarySearch
等方法区分查找方式
LinkedList
LinkedList内部使用双向链表实现
内部关键变量
1 | // 列表大小 |
运行原理
向头部添加对象会创建一个next指向first的新节点,将first指向新节点
向指定位置添加对象创建一个prev指向该位置元素的prev,last指向该对象的新节点,原对象prev指向新节点
向尾部添加对象会创建一个prev指向last的新节点,将last指向新节点
Deque
LinkedList实现了Deque接口,说明LinkedList实现了可以当做一个双向队列使用,LinkedList使用的数据结构完美的支持双向队列
时间复杂度对比
操作\类型 | ArrayList | LinkedList |
---|---|---|
获取指定位置对象 | $O(1)$ | $O(n)$ |
向头部添加对象 | $O(n)$ | $O(1)$ |
向指定位置添加对象 | $O(n)$ | $O(n)$ |
向尾部添加对象 | $O(1)$ | $O(1)$ |
删除头部对象 | $O(n)$ | $O(1)$ |
删除指定位置对象 | $O(n)$ | $O(n)$ |
删除尾部对象 | $O(1)$ | $O(1)$ |
Vector与ArrayList区别
Vector与ArrayList实现原理基本类似
主要区别在于,Vector每个方法都是加了synchronized同步的,是线程安全的
而ArrayList是非线程安全的