一 继承关系
)
二 构造函数
[
-
ArrayList底层使用Object[] 存储 ,无参构造则是创建一个空数组
-
ArrayList(int) :可以指定Object[]的初始大小
-
ArrayList(Collection<? extends E> c) 将源集合copy到新集合
三 容量扩容
每次添加都会做边界校验,使用私有方法grow返回新集合
-
minCapacity 为当前的容量
-
newCapacity 计算后的新容量
-
当容器使用默认值也就是空数组时 则容量为10
-
之后的每次扩容1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
-
-
Arrays.copyOf()
- 底层使用System.arraycopy() arraycopy是native本地方法
private Object[] grow(int minCapacity) {
return elementData = Arrays.copyOf(elementData,
newCapacity(minCapacity));
}
四 类方法详解
- contains 如果此列表包含指定的元素,则返回{@code true}
-
底层调用indexOf() 判断返回下标
-
判断是否是同一对象 底层使用Object的equals()方法 判断的是对象的引用地址是否相同
public int indexOf(Object o) { return indexOfRange(o, 0, size); } int indexOfRange(Object o, int start, int end) { Object[] es = elementData; if (o == null) { for (int i = start; i < end; i++) { if (es[i] == null) { return i; } } } else { for (int i = start; i < end; i++) { if (o.equals(es[i])) { return i; } } } return -1; }
- toArray() 返回的不是elementData 它是用Arrays.copy()拷贝出新的数组返回
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
- T[] toArray(T[] a) 将集合中元素copy到a数组中
- a的长度大于集合的size 则a的其余空间用null填充
- a的长度小于集合的size 则创建新的数组
- remove() 底层会判断要删除的元素是不是最后一个元素 如果是则直接置null 如不是则需要对当前要删除元素之后的元素重排 ,所以ArrayList在删除操作时效率会低
if ((newSize = size - 1) > i)
System.arraycopy(es, i + 1, es, i, newSize - i);
es[size = newSize] = null;