一、.ArrayList:

写过的项目到现在基本上面向业务域查询返回大列表都是使用ArrayList来存储业务数据的。

定义:ArrayList是List接口的可变数组的实现。实现了所有的可选列表的操作并允许包括null在内的所有元素。除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。

每个ArrayList实例都有一个容量,该容量是指来存储列表元素的数组的大小,该容量至少等于列表数组的大小,随着ArrayList的不断添加元素,其容量也在自动增长,自动增长会将原来数组的元素向新的数组进行copy。因此,如果根据业务场景来提前预判数据量的大小。可在构造ArrayList时指定其容量。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加ArrayList实例的容量,这样就可以减少递增式再分配数量的操作。

注意:ArrayList不是线程安全的,如果存在多线程访问ArrayList实例的场景,其中一个线程要在改变ArrayList列表结构之前,需要先对它这个操作保持线程同步。

ArrayList继承了AbstractList抽象类并实现了List接口,底层使用数组保存所有元素。

AbstractList主要作用是定义抽象对数组操作的公共主要行为,供具备相似功能的子类来具体实现自己特定的逻辑。

二、初始化

java中list自动扩容 java list扩容_ArrayList扩容

我本地JDK1.7默认数组长度是0,JDK1.6初始化大小是10

 (1)添加元素,确定内部容量

java中list自动扩容 java list扩容_List_02

下面关注下ensureCapacityInternal(size+1)是如何扩容的。

java中list自动扩容 java list扩容_chyer_03

以上,elementData是用来存储实际数据的数组,minCapacity是最小的扩容容量。

三、扩容(重点)

java中list自动扩容 java list扩容_数组_04

总结:ArrayList是采取延迟分配对象数组大小空间的,当第一次添加元素时才会分配10个对象空间,当添加第11个元素的时候,会扩容1.5倍,当添加到16个元素的时候扩容为15*1.5=22,以此类推。

ArrayList每次扩容都是通过Arrays.copyof(elementData,newCapacity)来实现的。

当我们在明确对象的大致数目时候提前指定初始化数组的大小是一个非常明智的选择。