一、ArrayList概述
数组集合,无容量限制,非线程安全
ArrayList、Vector是线性表,使用Object数组作为容器去存储数据的,添加了很多方法维护这个数组,使其容量可以动态增长,极大地提升了开发效率。它们明显的区别是ArrayList是非同步的,Vector是同步的。不用考虑多线程时应使用ArrayList来提升效率。
ArrayList的基层是数组,实现了通过index直接访问数据
最佳使用推荐
数据连续写入,需要根据index进行查找;写入和删除较少的,必须使用有参数的构造,即使超过了也会自动扩展。
1.1、JDK8 的ArrayList实现
1)重要的成员变量
private static final int DEFAULT_CAPACITY = 10;
默认初始化容量
transient Object[] elementData;
存储arraylist元素的数组缓冲区。arraylist的容量是这个数组缓冲区的长度。任何带有elementdata==defaultcapacity_empty_elementdata的空arraylist将在添加第一个元素时扩展为默认容量
private static final Object[] EMPTY_ELEMENTDATA = {};
用于空实例的共享空数组实例。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
共享空数组实例,用于默认大小的空实例。我们将其与空元素数据区分开来,以了解何时充气添加第一个元素。
2)构造方法
构造一、空参数构造,构造初始容量为10的空列表。
//构造初始容量为10的空列表。 public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; }
创建一个空的共享数组实例,没有初始化的默认的10,默认的是在第一add时候创建的
构造二、初始容量构造。按照给点参数构造
//构造具有指定初始容量的空列表。 public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } }