一、List接口的实现类ArrayList(数据结构:数组结构)
- 数据结构:数组结构
- 有序、允许空元素、允许重复元素
- 查询快、增删慢
- 不指定容量,则初始容量为10
- 扩容机制:一般是旧容量的1.5倍
- 不同步
java.util.ArrayList集合的数据结构是数组结构(API中可知道:ArrayList是List接口的大小可变的数组的实现),允许空元素。
元素查询快、增删慢,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList是最常用的集合。
每个ArrayList实例都有一个容量,容量是用于存储列表中的元素的数组的大小。它总是至少与列表大小一样大。 当元素添加到ArrayList时,其容量会自动增长
请注意,此实现不同步
ArrayList源码:底层实现是数组结构
以add方法为例,翻到源码的底层调用:
可以看到向集合中添加一个元素,实际上是创建了一个数组,将原数组的元素复制到新数组中。所以ArrayList对于元素的增删是很慢的,由于数组地址是连续的,查询是很快的。
二、JDK8源码
ArrayList JDK8下的源码 jdk1.8.0_121
在JDK8中,使用ArrayList 的无参构造方法,集合的初识容量仍然为10,但是和JDK7有很大不同
无参构造方法
在创建集合后,未使用集合的情况下底层并没有给集合初始容量
来看下add方法
调用ensureCapacityInternal方法,并将0+1作为参数传递,如果集合=={},说明是第一次向集合中添加元素,那么在DEFAULT_CAPACITY常量值为10和minCapacity值为1中取最大值10
调用ensureExplicitCapacity方法,并把10作为参数传递
满足>0的条件,调用方法grow,并把10作为参数传递
此时完成集合容量的设定,初识容量为10,数据结构为数组结构
执行完add方法的第一行后,集合的初识容量为10,再执行第二行,向集合中添加一个元素
三、扩容机制
ArrayList扩容机制
查看源码后我们了解了当使用无参构造方法创建ArrayList对象时,无论JDK7还是JDK8,其初识容量都是10。当我们不断的向集合中add元素时,添加的元素可能会超出集合的初识容量,这时就涉及到扩容。
我们写代码能不断的add,看似容量是无限的,实则代码底层是有扩容机制的
一般是,原容量的1.5倍。
所以,这就提醒我们在平时开发中,如果需要大容量的ArrayList集合,就会需要不断扩容,那么我们就不要使用无参构造方法来创建ArrayList对象,可以改为采用带参的构造方法创建ArrayList对象,参数是我们设定的集合容量
源码如下: