容器ArrayList原理(学习)
一、概述
动态数组,容量能动态增长,元素可以为null,用数组存储,非线程同步(vector线程同步)
每个 ArrayList 实例都有一个容量,该容量是指用来存储列表元素的数组的大小,自动增长(默认初始大小为10,然后递增式大约1.5倍增长)会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造 ArrayList 时指定其容量。在添加大量元素前,应用程序也可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量,这可以减少递增式再分配的数量。
二、实现
底层为数组存储;
add操作 =》
先ensureCapacity ;扩容 newCapacity = (oldCapacity * 3)/2 + 1;之后Arrays.copyOf数组拷贝;
get操作=》
index越界抛异常
remove操作=》
public E remove(int index) :return oldValue;
数据再拷贝使用 System.arraycopy
public boolean remove(Object o)
三、容量增长,使用注意点
数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的 1.5 倍(从newCapacity = (oldCapacity * 3)/2 + 1;)
。
这种操作的代价是很高的,因此在实际使用时,我们应该尽量避免数组容量的扩张。
当我们可预知要保存的元素的多少时,要在构造 ArrayList 实例时,就指定其容量,以避免数组扩容的发生。
或者根据实际需求,通过调用ensureCapacity 方法来手动增加 ArrayList 实例的容量。
四、Fail-Fast 机制