变量
size ArrayList实际个数
transient Object[] elementData;储存数组
private static final int DEFAULT_CAPACITY = 10;默认个数是10个
构造方法
-
public ArrayList() {
-
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
-
}
-
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);
-
}
-
}
它是如何扩展的呢
-
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:
-
elementData = Arrays.copyOf(elementData, newCapacity);
-
}
一般发生在什么时候,add的时候进行调用,扩展是1.5倍
add方法
-
public boolean add(E e) {
-
ensureCapacityInternal(size + 1); // Increments modCount!!
-
elementData[size++] = e;
-
return true;
-
}
-
public void add(int index, E element) {
-
rangeCheckForAdd(index);
-
ensureCapacityInternal(size + 1); // Increments modCount!!
-
System.arraycopy(elementData, index, elementData, index + 1,
-
size - index);
-
elementData[index] = element;
-
size++;
-
}
rangeCheckForAdd是看看索引会不会越界,ensureCapacityInternal看看是否需要扩容
remove的话将数组某下标设置为空
一般使用for循环去遍历的