ArrayList源码分析与内部实现(jdk1.9)

本帖最后由 空白都是空白 于 2018-6-12 18:16 编辑

         通过阅读源码内部实现可以更好的帮助我们理解类,今天要分析的是Arraylist的源码。new一个ArrayList类,点击ctrl+ 鼠标左键就可以进入内部查看源代码。

        主要了解一下几个方面

        1、ArrayList的底层是数组

        2、ArrayList是不定长的,如何实现。

        3、尝试写一个自己的ArrayList.


初始化变量



构造器
 


指定初始容量的构造器



声明elementData数组
 

声明modCount计数器
 

add方法
 

grow方法
 



newCapacity(扩容机制)
 

ensureCapacity
 


size && empty

 

contains
 


总结:        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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值