容器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 机制


posted @ 2017-06-09 11:08  牛哥学coding  阅读(129)  评论(0编辑  收藏  举报