集合List和ArrayList等实现类的底层原理分析
分类:
文章
•
2024-08-13 22:48:16
List
- 概述
- 继承Collection和Iterable接口
- 有序的允许重复的集合,允许null值(不推荐),允许将自身作为元素(不推荐)
- 此接口和实现子类可以对列表中的每个元素的插入位置进行精确控制。可以根据索引访问元素,也可以搜索列表中的元素。
- 有iterator迭代器可单向遍历,同时有ListIterator双向遍历
- 选用概述
- 线程安全用Vector
- 线程不安全,查询多用ArrayList,增删多用LinkedList
- ArrayList:底层数组,查询快,增删慢,线程不安全
- LinkedList:底层双向链表,查询慢,增删快,线程不安全
- Vector:底层数组,线程安全
- 方法
- 继承Collection的方法
- get(int index):通过索引取出元素
- subList(int start,int end): 开始到结束-1的位置,获取此段的子list的视图
list的实现子类
- ArrayList

- 概述
- 底层实现
- Object数组实现,存入元素时会丢失类型
- 底层扩容因子为原长度的1.5倍
- 默认数组长度是10,扩容时最大长度为int最大数
- 对象内部有继承自父类AbstractList的modcount属性
- 每次对数组结构进行改变时,该值都会增加1
- 在迭代器中会有expectedModCount值,会与此值进行比较,如果一致迭代;不一致,抛出异常。
- 简单校验,防止迭代期间原始集合改变
- RandomAccess接口
- 用于标明实现该接口的List支持快速随机访问,主要目的是使算法能够在随机和顺序访问的list中表现的更加高效。
- 所以有此接口的集合,优先选用for循环遍历;
- 方法
- 继承自list的对元素和索引的增删改查
- removeRange(int start,int end):范围内删除,开始到结束-1
- trimToSize():缩小长度
Vector 向量

- 概述
- 会自动扩容的数组,线程安全
- 基本与ArrayList一致,只要记住多了线程安全,效率低低一点
- 查询快,增删慢
- 底层实现、
- Object数组实现,
- 默认数组长度为10,默认的扩容长度是原数组2倍,也可通过构造器自定义扩容长度
- 也有modcount值
- 每次对数组结构进行改变时,该值都会增加1
- 在迭代器中会有expectedModCount值,会与此值进行比较,如果一致迭代;不一致,抛出异常。
- 简单校验,防止迭代期间原始集合改变
- 方法
- capacity():底层数组长度,不是数组内元素的个数
- size():元素的个数
Stack 栈

- 概述
- 表示后进先出的(LIFO)的对象堆栈,只能在堆栈的顶部操作
- 继承自Vector
- 创建时不包含元素
- 由于Queue队列拥有的堆栈操作设定更完整和一致,因此推荐使用Queue,不推荐使用此类
- 允许将Vector视为堆栈
- 方法
- 继承自vector的方法
- empty():空校验
- peek():查看堆栈顶部的对象
- pop():取出堆栈顶部的对象
- push(E e):把元素e压入堆栈顶部
- search(E e):搜索元素在堆栈中的位置
LinkedList

- 概述
- 既有线性列表list特点,又有队列queue的特点,同时又有链表的特点
- 查询慢,增删快;线程不安全
- 允许空值
- 允许将链表用作堆栈 队列和双端队列
- 任何使用索引的方法,都会从头 或尾 遍历集合,因此效率很低,尽量不用
- 底层实现
- 双向链表实现
- 也有modcount值
- 每次对数组结构进行改变时,该值都会增加1
- 在迭代器中会有expectedModCount值,会与此值进行比较,如果一致迭代;不一致,抛出异常。
- 简单校验,防止迭代期间原始集合改变
- 方法
- 继承自list和queue的方法
- 有操作集合头尾元素的方法
- addFirst等方法无返回值,有问题抛异常
- offer和offerFirst等返回boolean值来确定
- getFirst方法遇空集合时抛异常
- pop和peek等方法遇空集合时返回null值
- 方法会通过从集合取值是否为空来做判断,所以集合中尽量不要放空值