这里只是对ArrayList的简要解析,不喜勿喷,多多点赞。下面直接看源码
public ArrayListextends AbstractList implements List{ //用于空实例的共享空数组实例。 private static final Object[] EMPTY_ELEMENTDATA = {}; //存储数据的容器 private transient Object[] elementData; //数组的长度 -- 指针 private int size; //默认容器长度 private static final int DEFAULT_CAPACITY = 10; //数组容器最大的长度 private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; public ArrayList(){ super(); //调用无参构造函数创建,直接将空数组EMPTY_ELEMENTDATA 的地址给它 this.elementData = EMPTY_ELEMENTDATA; } public ArrayList(int initialCapacity) { super(); //初始化长度小于0,就抛异常 if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); //初始化数组 this.elementData = new Object[initialCapacity]; } public boolean add(E e) { //判断是否扩容 ensureCapacityInternal(size + 1); //添加元素 elementData[size++] = e; return true; } private void ensureCapacityInternal(int minCapacity) { //使用无参构造创建对象时,第一次添加数据就会进入到此判断 if (elementData == EMPTY_ELEMENTDATA) { minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; //准备扩容的长度 必须大于 现有数组的长度 if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { 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); } private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; } }
常见面试题
- ArrayList list = new ArrayList();底层的数组容器就是个空数组-- {}
- ArrayList list = new ArrayList(100);底层的数据容器就是 – new Object[100]
- ArrayList默认初始化长度为10
- 容器最大长度Integer.MAX_VALUE-8,因为一些vm在数组中保留一些头部信息,这个信息需要空间存储,所以减去8的空间就用来装头部信息
- 扩容的长度是原来的1.5倍



