Android学习之路(八)---- ArrayList
ArrayList
1. 数据结构
transient Object[] elementData;
2. 构造函数
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);
}
}
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
//这是一个空的常量数组,预分配一个空的数组使用
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
可以看出这里是默认分配一个空数组来预分配
3. 添加操作系列方法
3.1 add
public boolean add(E e) {
//在这里扩容
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
3.2 扩容
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//这里就是扩充方式,旧容量加上旧容量的一半
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
/**在这里面填充数据为Object,就会创建一个新的数组类装填
* T[] copy = ((Object)newType == (Object)Object[].class)
* ? (T[]) new Object[newLength]
* : (T[]) Array.newInstance(newType.getComponentType(), newLength);
*/
elementData = Arrays.copyOf(elementData, newCapacity);
}
//在这里防止扩充size最大值
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
可以看出先判断是否需要扩容,需要扩容就是旧容器加旧容器的一半,扩容最大MAX_ARRAY_SIZE
。
总结
- ArrayList比较简单,一般及设计数据结构以及扩容
- 在构造方法中默认是一个空数组,所有第一次添加一般都需要扩容