我爱你是多么清楚多么坚定的信仰!
今天我们来看下ArrayList的内部结构。
1.类的结构
2.类结构解析
属性:
serialVersionUID:序列化ID
默认容量为10
private static final int DEFAULT_CAPACITY = 10;
/**
* Shared empty array instance used for empty instances.
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
这段代码表名ArrayList的内部是Object数组的形式存在。那么我们就很好奇为什么ArrayList可以实现动态数组的功能呢?它是怎么实现动态数组的功能的?它怎么扩容?
private transient Object[] elementData;
/**
* The size of the ArrayList (the number of elements it contains).
*
* @serial
*/
private int size;
size表示数组中元素的个数,由于数组不一定完全装满,所以size一般小于数组的实际容量。
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA;
}
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList继承自AbstractList这个抽象类,实现了4个接口
List接口
这个接口的方法:集合大小size(),是否为空isEmpty(),是否包含contains(Object),下标查询indexOf(Object),上一次出现的下标lastIndexOf(Object),清空集合clear()
增删改查:add(E),add(int,E),allAll(Collection),add(int,Collection),set(int,E),删除某个下标对应的对象remove(int),get(int)
迭代输出:iterator(),listIterator(),listIterator(int),subList(int,int)
比较:equals(Object),hashCode()
ArrayList的基本功能:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}