解析ArrayList工作原理

首先,第一次看源码的时候跟我们使用时候一样,第一步先创建个对象,然后再看这里面平常使用的方法,一般情况下都会发现会存在两个构造函数,其中一个必定是空构造函数,那么,我们也从空构造函数看起吧!

  • 你会发现此处定义了一个null数组
    解析ArrayList工作原理
    解析ArrayList工作原理
    解析ArrayList工作原理
  • 无参构造这就看完了,再看下有参构造
    解析ArrayList工作原理

这里你会发现,如果你指定了初始容量的话,此处会进入一些基本判断,倘若initialCapacity为-1,那么直接会通过IllegalArgumentException异常抛出来,相反,传入的值是合理的话,就表示容器已经创建好了,看到此处是不是觉得特别简单呢?别急 !!!继续往下看着哈。

  • 接下来,有些小伙伴可能就迷茫了,也不知道从何入手了,在平时我们使用的时候常用的方法就是add(E e)方法了,我们可以先从这块入手,继续跟代码
    解析ArrayList工作原理
    解析ArrayList工作原理

从这里可以发现,刚开始的话size初始化的值为0,当size==initialCapacity时就会进入扩容机制了,否则,会直接把这个元素值装进elementData[]数组里面
解析ArrayList工作原理

  • 此时会进入扩容机制,此时会把size+1
    解析ArrayList工作原理
    解析ArrayList工作原理
  • 扩容机制的原理就在此处了,你可以发现newCapacity=1.5oldCapacity,if(newCapacity - minCapacity <= 0)为true时,此刻在不出现内存溢出的情况下,会返回minCapacity 长度,为false时,返回newCapacity 长度
    解析ArrayList工作原理
  • 这里你会再次发现,就是把原数组的数据copy至新数组中,然后返回该数组,此时你就了解到,原来ArrayList集合的扩容是这么的容易,细心的童鞋会发现上边在创建newCapacity 容量时有一个else比较
    解析ArrayList工作原理
    这块会发现最大容量等于Integer.MAX_VALUE(也就是2 ~31次方)-8;后来在官网上发现,是因为内存中需要用8个字节存Integer.MAX_VALUE的值,所以此处需要减去8字节。到此算是基本的了解了,有童鞋发现我这有说错的地方可以提出来,咱们一块学习一块进步,奥利给!!!