一:原始容量
1 使用空参构造时,原始容量为0
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
private static final Object[] DEFAULTCAPACITY_EMPTY_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);
}
}
3 传入集合时,以集合大小作为容量大小
public ArrayList(Collection<? extends E> c) {
Object[] a = c.toArray();
if ((size = a.length) != 0) {
if (c.getClass() == ArrayList.class) {
elementData = a;
} else {
elementData = Arrays.copyOf(a, size, Object[].class);
}
} else {
// replace with empty array.
elementData = EMPTY_ELEMENTDATA;
}
}
二:扩容规则
add方法:
1 初次扩容是10
2 每次扩容是上次1.5倍
addAll方法
两种情况
1 arraylist是空的情况下
如果传入的集合元素小于10,则第一次扩容10;
如果元素超过10,则以传入的元素个数为准
2 arraylist已经有元素的情况下
在下次扩容数量和元素个数之间选择一个较大值
例如: 现在已经有10个元素,容量是10,
在增加三个元素,此时扩容是15,因为15>13
如果此次增加6个元素,
那么扩容就是16,因为16>15