ArrayList 特有的方法(一般也是用的其父类List的方法):
ensureCapacity(int minCapacity) //初始化容量
trimToSize() //清除剩余容量
笔试题目:
使用ArrayList无参的构造函数创建一个 对象时, 默认的容量是多少? 如果长度不够使用时又自增增长多少?
ArrayList底层是维护了一个Object数组实现 的,使用无参构造函数时,Object数组默认的容量是10,当长度不够时,自动增长0.5倍。
原理剖析:
私有变量:
private transient Object[] elementData;//维护的Object数组
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;//ArrayList最大容量
构造方法:
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0) //容量小于0抛出异常
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];//创建对应容量数组
}
public ArrayList() {
this(10); //默认容量10
}
添加数据方法:
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
/*如果最小需求容量 - 当前空间容量 > 0 代表"当前容量不够"*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//a >> n =a / 2^n
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:
elementData = Arrays.copyOf(elementData, newCapacity);
}
/*newCapacity = oldCapacity + oldCapacity/2
如果newCapacity还是小于oldCapacity,那么新容量就用oldCapacity
如果newCapacity大于了最大容量,那么就会进行大容量处理*/
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}