Ch02-Java Collection 之 ArrayList

Ch02-Java Collection 之 ArrayList

January 20, 2017
Java | Collection
java

ArrayList 实现了 List 接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入 null 元素,底层通过数组实现。除该类未实现同步外,其余跟 Vector 大致相同。

1. 底层数据结构 #

ArrayList 基于数组实现,它有一个容量 (capacity) 表示底层数组的实际大小,容器内存储元素的个数不能多于当前容量。当向容器中添加元素时,如果容量不足,容器会自动增大底层数组的大小。Java 泛型只是编译器提供的语法糖,所以这里的数组是一个 Object 数组,以便能够容纳任何类型的对象。

arraylist

size(), isEmpty(), get(), set() 方法均能在常数时间内完成,add() 方法的时间开销跟插入位置有关,addAll() 方法的时间开销跟添加元素的个数成正比。其余方法大都是线性时间。为追求效率,ArrayList 没有实现同步 (synchronized),如果需要多个线程并发访问,用户可以手动同步,也可使用 Vector 替代。

2. 自动扩容 #

每当向数组中添加元素时,都要去检查添加后元素的个数是否会超出当前数组的长度,如果超出,数组将会进行扩容,以满足添加数据的需求。

数组扩容通过一个公开的方法 ensureCapacity(int minCapacity) 来实现。在实际添加大量元素前,也可以使用 ensureCapacity 来手动增加 ArrayList 实例的容量,以减少递增式再分配的数量。数组进行扩容时,会将老数组中的元素重新拷贝一份到新的数组中,每次数组容量的增长大约是其原容量的 1.5 倍。

arraylist-grow