类图:
图片来自:https://www.cnblogs.com/paddix/p/5539326.html
1.ArraylList
(1)定义
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
RandomAccess,可以通过下标随机访问元素;Cloneable,可以复制;Serializable,可以序列化
(2)结构
用来存储数据的是一个数组,数组的特点:在内存中是连续的,长度固定不可改变。
ArrayList的默认长度:
- 当你创建一个空的ArrayList,默认长度为10;
- 当你创建一个有初始化值的ArrayList,则长度为初始化元素的数量;
- 创建时声明了长度,则长度为声明的长度;
ArrayList长度的变化:
- 当向ArrayList中插入新元素,而ArrayList中的数组长度不够时,会创建一个新的数组来保存数据。
- 数组长度的增长不是每次+1,这样花销太大,因为每次增长都要把旧数组的数据复制到新数组。
- 一般情况下,新数组的长度是原长度的1.5倍。
- 当原数组过小时,准确说小于默认的长度10,增长计算时,会视其长度为10,简单说,新数组长度为15。
ArrayList删除元素时:
- 仍会使用原数组;
- 会把删除的元素之后的元素全部往前移动;
- 删除元素越靠前,消耗越大。
(3)特点分析
数据结构简单
遍历速度块,下标访问式的for循环速度高于迭代器遍历
插入删除代价较大,
新增元素,数组较小时平均消耗较大;数组较大时,平均消耗较小
线程不安全
2.Vector
与ArrayList相似,这里简单说一下不同。
线程安全(最大的特点)
数组增长,每次为原来的2倍。
3.Stack
继承自Vector,和我们理解的栈一样,只能在栈尾操作,先进后出,后进先出。
4.LinkedList
(1)定义
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
与ArrayList相比,多继承了一个Deque,Deque是一个双向队列,队首队尾都可以添加弹出。
(2)结构
只有这三个成员:长度,首,尾。
Node子类的结构也很简单。
(3)特点分析
遍历速度较慢,迭代器遍历性能略高于forEach,千万不要使用下标for循环(灾难性的慢)
插入删除速度较快。
新增的话,列表长度较小时优于ArrayList,列表长度较大时不如ArrayList。
综合来看,平时使用ArrayList的场合会更多,只有需要频繁插入删除才会用LinkedList