集合类图

image.png

初始化

  1. //如果使用默认的构造函数的话,就会使用这个对象初始化
  2. private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
  3. //如果使用 0 作为初始化容量的时候,ArrayList就会使用这个对象来初始化
  4. private static final Object[] EMPTY_ELEMENTDATA = {};
  5. //ArrayList的底层数据结构,只是一个对象数组,用于存放实际元素
  6. //并且被标记为transient,也就意味着在序列化的时候此字段是不会被序列化的
  7. transient Object[] elementData;
  8. //直接使用DEFAULTCAPACITY_EMPTY_ELEMENTDATA来初始化
  9. public ArrayList() {
  10. this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  11. }
  12. //当initialCapacity 为0的时候,则会使用EMPTY_ELEMENTDATA初始化
  13. //适用于我们知道固定的大小的个数,直接使用这个可以避免后期的扩容
  14. public ArrayList(int initialCapacity) {
  15. if (initialCapacity > 0) {
  16. this.elementData = new Object[initialCapacity];
  17. } else if (initialCapacity == 0) {
  18. this.elementData = EMPTY_ELEMENTDATA;
  19. } else {
  20. throw new IllegalArgumentException("Illegal Capacity: "+
  21. initialCapacity);
  22. }
  23. }

添加

//添加元素主要做的3件事情
//1.首先确保能够将希望添加到集合中的元素添加到集合中,即确保ArrayList的容量
//2.然后将数据添加到elementData中指定位置
//3.最后将集合中的实际个数+1
public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

查询

public E get(int index) {
    //检查索引释放合法
    rangeCheck(index);
    //取值
    return elementData(index);
}

删除

public E remove(int index) {
    rangeCheck(index);

    modCount++;
    E oldValue = elementData(index);

    int numMoved = size - index - 1;
    if (numMoved > 0)
        System.arraycopy(elementData, index+1, elementData, index,
                         numMoved);
    elementData[--size] = null; // clear to let GC do its work

    return oldValue;
}