集合List和ArrayList等实现类的底层原理分析

xiaoxiao2021-02-28  11

List

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

list的实现子类

- ArrayList

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

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值 方法会通过从集合取值是否为空来做判断,所以集合中尽量不要放空值
转载请注明原文地址: https://www.6miu.com/read-1400300.html

最新回复(0)