今天要和大家分享ArrayList的扩容机制。
在开始之前要和大家介绍几个简单的入门知识点:
ArrayList的底层数据结构是动态数组
capacity相当于初始化数组的大小
size就相当于数组的实际长度
为什么需要扩容?
> /**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
查看源码可以发现,默认容量是10。
但是当我们使用无参构造的方法时,初始的ArrayList的数组容量仍是0 。
只有当我们使用add方法添加元素的时候,才真正为数组分配大小为10的容量。在这里插入代码片
当我们添加第一个元素时,size=1;
当我们添加第十个元素的时候,此时size=10;
当我们添加第十一个元素的时候,此时的size就变成了11,但是呢?ArrayList的容量只有10,这个时候可能装不下第十一个元素,此时ArrayList的扩容机制就发挥作用了。
扩容机制的过程
当数组的size=capacity时,如果继续往数组中添加元素,此时就会新建一个1.5倍容量的数组。然后把之前的数组复制到新的数组,将之前的数组进行销毁等一系列操作。
为什么扩容是1.5倍呢?
因为扩容的倍数越大,开辟的空间就越多,很可能造成空间的浪费。
扩容倍数越小,可能造成开辟的空间不够使用的,会增加扩容的次数,这样很影响程序的性能。因为一次扩容包括数组的新建、将原来的数组拷贝到新数组上,销毁原来的数组等一系列操作。
当然,1.5是经过科学的计算方式。