浅浅的阅读一下 ArrayList 的源码


浅浅的阅读一下 ArrayList 的源码


显示代码

// 初始化一个集合
List list = new ArrayList<>();

// 增加元素内容
list.add("好好学习");

主要关注 集合的创建 和 集合add的方法的底层代码逻辑

  • 集合的创建
// ArrayList() 的无参构造方法
public ArrayList() {
    
    // 初始化成员变量 elementData (元素数据)
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

// 关注的成员变量
// 底层数组
transient Object[] elementData;

// 初始化数据 长度为 0
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
  • 集合开始增加元素
// 第1步方法 进入add泛型方法
public boolean add(E e) {
    
    // 2 进入 ensureCapacityInternal 方法
    ensureCapacityInternal(size + 1);  // 0 + 1 = 1
    elementData[size++] = e;
    return true;
}

// size 成员变量
private int size; // 初始化为 0 

// 第2步方法	参数 minCapacity = 1
private void ensureCapacityInternal(int minCapacity) {
    
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}


// 第3步方法 calculateCapacity
// 参数 Object[] elementData = {} , minCapacity = 1
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    
    // 成立
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        
        		// 10 > 1 返回 10
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}

// 常量 DEFAULTCAPACITY_EMPTY_ELEMENTDATA
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

// 常量 DEFAULT_CAPACITY
private static final int DEFAULT_CAPACITY = 10;


// 第3步方法	参数 minCapacity = 1
private void ensureCapacityInternal(int minCapacity) {
    
    ensureExplicitCapacity(10);
}

// 第4步方法	参数 minCapacity = 10
private void ensureExplicitCapacity(int minCapacity) {
    // 记数器
    modCount++;

    //  10 - 0 > 0 成立
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

// 第5步方法 grow(10)
private void grow(int minCapacity) {
    
    int oldCapacity = elementData.length;				// oldCapacity = 0
    // 当数组满时 >> 扩容 1.5 倍
    int newCapacity = oldCapacity + (oldCapacity >> 1);  // newCapacity = 0 + 0 / 2 = 0
    // 0 - 10 < 0 成立
    if (newCapacity - minCapacity < 0)
        
        newCapacity = minCapacity;
    // 0 - 21亿 - 8 不成立
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // 参数 elementData = {} newCapacity = 10
    elementData = Arrays.copyOf(elementData, newCapacity);
}

// MAX_ARRAY_SIZE 常量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

// 第6步方法 elementData = Arrays.copyOf(elementData, newCapacity);
// 参数 original = elementData newLength = 10
public static  T[] copyOf(T[] original, int newLength) {
    
    // 返回新的一个数组
    return (T[]) copyOf(original, newLength, original.getClass());
}

以上为代码记录

可通过IDEA调试模式进行更为细致的观看源码的逻辑