ArrayList 源码解析和设计思路

整体架构:
    ArrayList 整体架构比较简单,就是一个数组结构,比较简单,如下图
  图中展示是长度为 10 的数组,从 1 开始计数,index 表示数组的下标,从 0 开始计数, elementData 表示数组本身,源码中除了这两个概念,还有以下三个基本概念:
   1、DEFAULT_CAPACITY 表示数组的初始大小,默认是 10,这个数字要记住;
   2、size 表示当前数组的大小,类型 int,没有使用 volatile 修饰,非线程安全的;
   3、modCount 统计当前数组被修改的版本次数,数组结构有变动,就会 +1。
 
源码解析
   1、初始化 
    有三种初始化办法:源码如下:
 无参数直接初始化
       
指定初始数据初始化
 
指定大小初始化
总计:ArrayList 无参构造器初始化时,默认大小是空数组,并不是大家常说的 10,10 是在第一次add 的时候扩容的数组值
 
2.2 新增和扩容实现
    新增就是往数组中添加元素,主要分成两步:
         1、判断是否需要扩容,如果需要执行扩容操作;
         2、直接赋值。
 
两步源码体现如下:
     
总结:
    1、扩容的规则并不是翻倍,是原来容量大小 + 容量大小的一半,直白来说,扩容后的大小是原来容量的 1.5 倍
    2、ArrayList 中的数组的最大值是 Integer.MAX_VALUE,超过这个值,JVM 就不会给数组分配内存空间了
    3、新增时,并没有对值进行严格的校验,所以 ArrayList 是允许 null 值的。 
posted @ 2020-04-08 16:02  凌绝顶122  阅读(115)  评论(0)    收藏  举报