查看 ArrayList
源码:
public class ArrayList<E> extends AbstractList<E> implements List<E>,RandomAccess,Cloneable,java.io.Serializable{}
ArrayList
继承了 AbstractList
,查看 AbstractList
源码
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>{}
查看源码得知,AbstractList
父类已经实现了 List<E>
接口,为什么 ArrayList<E>
实现类又实现了 List<E>
接口?
这里集合的创始人承认这是一种失误,但是后续呢没有删掉,现在JDK已经更新到 18,19 但却从未删除这里的小问题,因为觉得这个小失误不值得去修改了
ArrayList<E>
实现类源码中应该有两个重要属性,
public class ArrayList<E> extends AbstractList<E> implements List<E>,RandomAccess,Cloneable,java.io.Serializable{
// 底层的数组,数组类型为Object,正因为是Object类型,所以可以放不同数据类型数据
private transient Object[] elementData;
// 数组中的有效数据长度
private int size;
public ArrayList(){
this(10);
}
public ArrayList(int initialCapacity){
super();
// 健壮性代码
if(initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: " + initialCapacity);
// 给elementData数组初始化,默认长度为10
this.elementData = new Object[initialCapacity];
}
// 调用add方法向底层数组中添加元素
public boolean add(E e){
// 数组的扩容操作
ensureCapacityInternal(size + 1);
// 最开始size为0,添加元素后size+1操作
elementData[size++] = e;
// 添加成功返回true
return true;
}
// 数组扩容
public void ensureCapacityInternal(int minCapacity){
modCount++;
if(minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity){
int oldCapacity = elementData.length;
// 新数组空间 = 当前数组长度 + 当前数组/2
// 15 = 10 + 5,扩容相当于新建了长度为15的数组
int newCapacity = oldCapacity + (oldCapacity >> 1);
if(newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if(newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// elementData数组指向扩容后的数组
// Arrays.copyof做的事就是将旧数组里的元素拷贝到新数组中
elementData = Arrays.copyof(elementData,newCapacity);
}
}
在 JDK1.7 中,在调用构造器的时候给底层数组 elementData
初始化,数组初始化长度为 10
当数组中的10个位置都满了的时候就开始进行数组的扩容,扩容长度为原数组的1.5倍