ArrayList 源码分析

List list =new ArrayList();//初始化list
        list.add(LocalDate.now());

快捷键:Ctrl+Alt +(<-  |||    ->);回到上一步,回到下一步

 

 

 

 创建对象时,初始化了一个Object类型的空数组:

 

add方法:第一次添加元素是时:会检查elementData【数组】的长度。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 第一次扩容就创建一个长度为10的数组:

 

 

 

从0开始一一赋值进去:所以就行了

  ensureExplicitCapacity方法可以判断是否需要扩容:

 

接下来重点来了,ArrayList扩容的关键方法grow():

 

复制代码
  private void grow(int minCapacity) {
          // 获取到ArrayList中elementData数组的内存空间长度
          int oldCapacity = elementData.length;
         // 扩容至原来的1.5倍
         int newCapacity = oldCapacity + (oldCapacity >> 1);
         // 再判断一下新数组的容量够不够,够了就直接使用这个长度创建新数组,
          // 不够就将数组长度设置为需要的长度
         if (newCapacity - minCapacity < 0)
             newCapacity = minCapacity;
         //若预设值大于默认的最大值检查是否溢出
         if (newCapacity - MAX_ARRAY_SIZE > 0)
             newCapacity = hugeCapacity(minCapacity);
         // 调用Arrays.copyOf方法将elementData数组指向新的内存空间时newCapacity的连续空间
         // 并将elementData的数据复制到新的内存空间
         elementData = Arrays.copyOf(elementData, newCapacity);
     }
复制代码

 

 从此方法中我们可以清晰的看出其实ArrayList扩容的本质就是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去。

 

到此扩容就基本完成了。

 

posted on 2020-08-19 17:00  白嫖老郭  阅读(72)  评论(0)    收藏  举报

导航