深度了解Java集合------------ArrayList的实现原理
1.简单介绍一个ArrayList
ArrayList是List接口的一个可变数组的实现,实现了所有可选列表操作,并且允许包括null的所有元素,除了实现了List接口之外,此类还提供了一些方法来实现操作内部用来存储列表的数组的大小。
对于每个ArrayList实例都有一个容量,该容量是指用来存储元素的数组的大小,他的大小容量总是小于等于列表的长度大小的。随着不断的想ArrayList中不断添加元素,其容量也是随之自动增长。其动态实现自动增长的原理就是通过重新生成一个比原来集合大小大的新集合,然后将原集合中数据拷贝到新集合中,其每次扩容的大小约为原始数组的长度的1.5倍,此机制称为集合数组的动态扩容。因此对于声明一个已知固定数据量的集合,在构造ArrayList时可以指定其容量大小。在添加大量元素的时候,应用程序也可以使用ensureCapacity操作来增加ArrayList实例对象的容量,这将减少递增式再分配的数量。
在此,此实现不是同步的。如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么他必须保持外部同步。
那么相较而言,Vector的线程是安全的,这其中涉及到线程安全的方法都被同步操作了。
2.ArrayList的实现
对于ArrayList而言,它实现了List接口、底层数据结构是通过数组来保持所有元素的。对其的操作基本上都是按照数组的特性来进行操作的。