![](https://i-blog.csdnimg.cn/blog_migrate/e4721f40b3007035ee6b48874ac8f69f.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/53bed313f831330dea8f49286712be19.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/4e1f5319444b58e068f94d05c921f13a.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/d2c407bb0ecaff0db831a2aa0f7c952f.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/4e02a7a134d2ce1422473b866a4bdc46.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/99b4aa64a6b05b50e2de36b0e4028e93.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/3ecc0e52b579eca6ef23b88a9ff48136.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/6022d610091b0898aadb2ce74bd972a5.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/f2bc5f5574584de3d734301cfb3a2939.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/2dcb35ccc2aea35238e141707c09e8d9.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/7533210e5c9c6f6a7c22f30343c783a5.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/844dc7ef6401b36485476359d524428f.jpeg)
通过阅读源码内部实现可以更好的帮助我们理解类,今天要分析的是Arraylist的源码。new一个ArrayList类,点击ctrl+ 鼠标左键就可以进入内部查看源代码。
主要了解一下几个方面
1、ArrayList的底层是数组
2、ArrayList是不定长的,如何实现。
3、尝试写一个自己的ArrayList.
初始化变量
构造器
![](http://bbs2.itheima.com/data/attachment/forum/201806/12/180144ae1t1by52yppw7v1.jpg.thumb.jpg)
指定初始容量的构造器
![](http://chuantu.biz/t6/327/1528795431x-1404755696.jpg)
声明elementData数组
![](http://bbs2.itheima.com/data/attachment/forum/201806/12/180201ljoaaejpsvpoapap.jpg.thumb.jpg)
声明modCount计数器
![](http://bbs2.itheima.com/data/attachment/forum/201806/12/180213uv0i2d23jnn747nj.jpg.thumb.jpg)
add方法
![](http://bbs2.itheima.com/data/attachment/forum/201806/12/180222ku8849485od4t5d8.jpg.thumb.jpg)
grow方法
![](http://bbs2.itheima.com/data/attachment/forum/201806/12/180240u9719r8z787rb79d.jpg.thumb.jpg)
newCapacity(扩容机制)
![](http://bbs2.itheima.com/data/attachment/forum/201806/12/180248mbikoo6zovkomkkj.jpg.thumb.jpg)
ensureCapacity
![](http://bbs2.itheima.com/data/attachment/forum/201806/12/180257t7bvfrrr7nkfbv7f.jpg.thumb.jpg)
size && empty
![](http://bbs2.itheima.com/data/attachment/forum/201806/12/180306jyzh3h8jh1j4usy9.jpg.thumb.jpg)
contains
![](http://bbs2.itheima.com/data/attachment/forum/201806/12/180341re7s7veov3vs333o.jpg.thumb.jpg)
总结: 1、由构造函数明确ArrayList的底层是数组。
2、既然底层是数组,那他的特性是查询快,增删慢,因为增删底层用到Arrays.copyOf()方法
3、由newCapacity知道当ArrayList集合需要扩容时,每次增加1.5倍的容量,又由grow()方法得知,扩容的方式是用
1.5倍的容量复制数组。当容量很大时,开销很大,速度很慢。
注意事项: 1、网上分享的ArrayList源码分析大都是jdk1.9之前的版本,我阅读的是jdk1.9的源码,扩容代码由ensureCapacity抽取到了grow当中的newCapacity中
2、当ArrayList的容量足够大,自动扩容至1.5倍有可能导致内存不足OutOfMemoryError.
3、源码中默认初始容量为10,但当你指定new ArrayList(4) 的时候 初始容量为4 扩容为 7 -->11 -->17 方式为newlength = oldlength *1.5 + 1