01.20 专题:ArrayList

1、简述

ArrayList是java集合框架中比较长见的集合容器。其底层数据结构实现是容量大小动态变化的数组。从系统结构图中可知,ArrayList实现了List、RandomAccess、Cloneable、Serializable接口,继承了AbstractList抽象类。实现RandomAccess接口,提升对数据的查询效率。实现Cloneable接口,覆盖clone()函数,能被克隆。实现Serializable接口,可以支持序列化传输。

ArrayList体系结构图

2、成员变量

<code>//序列化版本
private static final long serialVersionUID = 8683452581122892189L;
//默认初始容量10
private static final int DEFAULT_CAPACITY = 10;
//用于空实例的共享空数组
private static final Object[] EMPTY_ELEMENTDATA = {};
//用于区别空实例的共享空数组的空数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//真正存放元素的数组
transient Object[] elementData;
//元素的个数
private int size;/<code>


3、构造函数

<code>//无参构造函数
public ArrayList() {


this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//初始化一个容量为initialCapacity个来构造ArrayList
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);
}
}
//指定Collection来构造ArrayList
public ArrayList(Collection extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
this.elementData = EMPTY_ELEMENTDATA;
}
}/<code>


4、Add方法(扩容机制)

<code>//添加元素(每次添加元素前都会判断容量否需要扩容)
public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}


private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0)
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
/<code>

简述ArrayList的扩容机制:

数组在添加元素之前,会去判断数组容量值需不需要扩增。如果容量值不够,就会在原有容量的基础之上增加0.5倍的容量值。之后将老的数组复制到新的数组里面。无参构造创建的ArrayList,容量值默认是10。


5、ArrayList常用核心方法:

<code>//元素个数
public int size() {...}
//集合是否为空
public boolean isEmpty() {...}
//是否包含元素“...”


public boolean contains(Object o) {...}
//返回元素“...”的第一次出现的索引
public int indexOf(Object o) {...}
//返回元素“...”的最后一次出现的索引
public int lastIndexOf(Object o) {...}
//根据索引获取元素
public E get(int index) {...}
//更新元素
public E set(int index, E element) {...}
//添加元素
public boolean add(E e) {...}
//指定索引处添加元素
public void add(int index, E element) {...}
//添加所有集合元素
public boolean addAll(Collection extends E> c) {...}
//指定索引处添加所有集合元素
public boolean addAll(int index, Collection extends E> c) {...}
//移除指定索引下的元素
public E remove(int index) {...}
//移除“...”元素
public boolean remove(Object o) {...}
//移除集合下的元素
public boolean removeAll(Collection> c) {...}
//转换为Object类型数组
public Object[] toArray() {...}
//转换为T类型数组
public T[] toArray(T[] a) {...}/<code>


6、总结

1.ArrayList数据是有序、和重复、可为Null。

2.非同步线程,线程不安全。

3.底层结构是数组,初始容量是10,每次扩容是增加0.5值。

4.查询访问快,新增删除慢。