数据结构
ArrayList的底层数据结构就是一个数组,数组元素的类型为Object类型,对ArrayList的所有操作底层都是基于数组的。
线程安全问题
线程不安全,只能用在单线程环境。
解决:第一,使用synchronized关键字;第二,可以用Collections类中的静态方法synchronizedList()对ArrayList进行调用即可
继承关系
实现了Serializable接口,因此它支持序列化,能够通过序列化传输;
实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问;
实现了Cloneable接口,能被克隆。
构造方法
有三种方式来初始化:
- 默认的构造器,将会以默认的大小来初始化内部的数组。JDK1.6中,无参数构造器初始长度为0,只有第一次添加数据长度才会扩容成默认长度为10。
- 用一个ICollection对象来构造,并将该集合的元素添加到ArrayList
- 用指定的大小来初始化内部的数组
public ArrayList();
public ArrayList(Collection<? extends E> c)
public ArrayList(int initialCapacity)
动态扩容机制
ArrayList的扩容主要发生在向ArrayList集合中添加元素的时候,总的来说就是分两步:扩容,把原来的数组复制到另一个内存空间更大的数组中;添加元素,把新元素添加到扩容以后的数组中
主要经历了以下几个阶段:
- 在add()方法中调用ensureCapacityInternal(size + 1)方法来确定集合确保添加元素成功的最小集合容量minCapacity的值。参数为size+1,代表了集合为了确保添加元素成功集合的最小容量minCapacity应该是size+1。在ensureCapacityInternal方法中,首先判断elementData是否为默认的空数组,如果是,最小需要容量就是默认容量10。
- 调用ensureExplicitCapacity(minCapacity)方法来确定是否需要对现有的元素数组进行扩容。首先将结构性修改计数器加一;然后判断minCapacity与当前元素数组的长度的大小,如果minCapacity比当前元素数组的长度大,需要扩容。
- 调用grow(minCapacity)方法,参数minCapacity表示集合为了确保添加元素成功的最小容量。在扩容的时候,首先将原元素数组的长度增大1.5倍(oldCapacity + (oldCapacity >> 1)),然后对扩容后的容量与minCapacity进行比较:① 新容量小于minCapacity,则将新容量设为minCapacity;②新容量大于minCapacity,则指定新容量。
- 将旧数组拷贝到扩容后的新数组中
- 将要添加的元素添加进扩容后的元素
参考了多篇博客综合而成
https://blog.csdn.net/weixin_36378917/article/details/81812210?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162555957016780265417341%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162555957016780265417341&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-81812210.first_rank_v2_pc_rank_v29&utm_term=arraylist%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4187
https://blog.csdn.net/LIZHONGPING00/article/details/103790652?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162555957016780265417341%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162555957016780265417341&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-3-103790652.first_rank_v2_pc_rank_v29&utm_term=arraylist%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4187
https://blog.csdn.net/lkp1603645756/article/details/81264257?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162555957016780265417341%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162555957016780265417341&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-81264257.first_rank_v2_pc_rank_v29&utm_term=arraylist%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86&spm=1018.2226.3001.4187