图解ArrayList源码

 

 

 

 

 

初始化数组长度为空时, 懒加载

 

 

 

 

 

 

 

 

 

 

 

 

 

 

add方法

初始无参构造器

第一次添加

 

public boolean add(E e) {
   // 确定容量 动态扩容 size 初始 0
   ensureCapacityInternal(size + 1);  // Increments modCount!!
   // 将要添加的元素 添加到数组中 elementData[0] = 1 --> size = 1
   elementData[size++] = e;
   return true;
}

 

 

private void ensureCapacityInternal(int minCapacity) {
       // ensureExplicitCapacity(10)
       ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

 

 

/**
* elementData {}
 minCapacity 1
*/
private static int calculateCapacity(Object[] elementData, int minCapacity) {
   if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
       // 10 1 return 10
       return Math.max(DEFAULT_CAPACITY, minCapacity);
  }
   // 5
   return minCapacity;
}

 

 

private void ensureExplicitCapacity(int minCapacity) {
   modCount++; // 增长 操作次数

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

 

 

private void grow(int minCapacity) { // 10
   // overflow-conscious code
   int oldCapacity = elementData.length; // 0
   // newCapacity = 0
   int newCapacity = oldCapacity + (oldCapacity >> 1);
   if (newCapacity - minCapacity < 0)
       // newCapacity = 10
       newCapacity = minCapacity;
   if (newCapacity - MAX_ARRAY_SIZE > 0)
       newCapacity = hugeCapacity(minCapacity);
   // {}   {,,,,,,,,,} 返回一个新的数组 长度为10
   elementData = Arrays.copyOf(elementData, newCapacity);
}

 

第二次添加
elementData = {1,,,,,,,,,};
size = 1;

 

public boolean add(E e) {
   // 2
   ensureCapacityInternal(size + 1);  // Increments modCount!!
   elementData[size++] = e; // elementData[1] = 2 size = 2
   return true;
}

 

 

private static int calculateCapacity(Object[] elementData, int minCapacity) {
   if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
       return Math.max(DEFAULT_CAPACITY, minCapacity);
  }
   // 2
   return minCapacity;
}

 

 

private void ensureExplicitCapacity(int minCapacity) {
   modCount++;

   // overflow-conscious code 2 - 10
   if (minCapacity - elementData.length > 0)
       grow(minCapacity);
}

 

 

第十一次添加

 

elementData = {1,2,3,4,5,6,7,8,9,10};
size = 10;

 

public boolean add(E e) {
   ensureCapacityInternal(size + 1);  // Increments modCount!!
   elementData[size++] = e;
   return true;
}

 

private void ensureCapacityInternal(int minCapacity) {
   // ensureExplicitCapacity(11)
   ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

 

private void ensureExplicitCapacity(int minCapacity) {
   modCount++;

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

 

 

private void grow(int minCapacity) { // 11
   // 10
   int oldCapacity = elementData.length;
   // 15 newCapacity 是oldCapacity的1.5倍
   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:
   // {1,2,3,4,5,6,7,8,9,10} -- > {1,2,3,4,5,6,7,8,9,10,,,,,}
   elementData = Arrays.copyOf(elementData, newCapacity);
}

 

 

 

 

 

posted @ 2022-01-25 19:45  小白冲  阅读(40)  评论(0编辑  收藏  举报