ArrayList实现类
ArrayList 底层数据结构就是数组,随机查询速度快、增删慢,线程不安全的,效率高,允许存放重复元素。
继承于 AbstractList 抽象类,实现了 List 接口
RandomAccess 接口,提供了随机访问支持。遍历元素的方法有快速随机访问和通过迭代器 Iterator 访问
Clonable 接口,可以被克隆 clone()
Serializable 接口,支持序列化
ArrayList 不是线程安全的,所以在无需考虑线程安全时使用,在需要考虑线程安全的多线程环境下可以考虑使用
Vector 或者 juc 包中的 CopyOnWriteArrayList
常量定义
private static final int DEFAULT_CAPACITY = 10;
//默认数组元素的初始化容积
private static final Object[] EMPTY_ELEMENTDATA = {};
//没有元素的空对象数组,没有存储任何元素,数组长度为 0
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//构建 ArrayList 时默认使用的空数组
属性
transient Object[] elementData;
就是用于存放元素的数组
private int size;
真实存放的元素个数
构造器 List list=new ArrayList();
默认构造器 ArrayList(); 实际上并没有直接开辟空间,而是使用常量空数组。
- ArrayList 实际上是通过数组保存数据,当构建 ArrayList 时,如果使用默认构造器,默认容积是 10,但是采用延
迟构建。 - 当 ArrayList 容积不足以存放元素时,会自动进行 50%增容处理。新容积=原始容积*3/2。
- ArrayList 克隆函数是将全局元素克隆到一个数组中。elementData 前面有 transient 修饰。
- ArrayList 实现序列化时,先写出容积,再依次写出每个元素。
linkedList实现类
LinkedList 底层数据结构是双向链表,查询慢、增删快,线程不安全的,效率高,允许存放重复元素。可以添加 null 值元素,允许元素重复,可以通过索引编号有序。
因为底层采用的是链表结构,所以没有容器的概念,从理论上来说可以无限制添加元素;但是 int size 限制了其中最大的元素个数为 Integer.max_value。
- size 元素个数
- first 和 last 是头节点和尾节点
- Node 节点定义
- item 就是具体存储的数据
- next 用于指向下一个节点的引用
- prev 用于指向前一个节点的引用
vector实现类
Vector 底层数据结构是数组,随机查询速度快、增删慢,线程安全,效率低,允许存放重复元素
数组,一般不使用,如果在多线程并发访问并求线程安全是可以考虑使用