程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(1)

学习笔记——Java ArrayList 源码阅读

发布于2021-05-29 21:17     阅读(482)     评论(0)     点赞(17)     收藏(5)


1、源码阅读

ArrayList中使用了Object类型的数组来存储数据。
在这里插入图片描述
如果此时调用无参的构造函数实例化一个对象,此时elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA ,此时的ArrayList容量为0
在这里插入图片描述
在调用add方法时会调用ensureCapacityInternal验证此时容量是否足够容纳添加的元素
在这里插入图片描述
ensureCapacityInternal判断此时elementData是否为默认空数组,如果是空则会赋值为默认容量DEFAULT_CAPACITY,也就是10
在这里插入图片描述
在这里插入图片描述
之后调用ensureExplicitCapacity确认是否扩容,防止溢出后调用扩容方法grow
在这里插入图片描述
扩容核心方法void grow(int minCapacity),这里使用了>>运算方式,旧容量+旧容量>>1作为新容量。大致可以认为原容量的1.5倍。而此时旧容量为0,所以对于空ArrayList第一次添加元素会将ArrayList扩容为10
在这里插入图片描述

2、扩容因子

为什么将新容量扩容为原容量的1.5倍,而不是2倍或者是固定数量,例如每次固定扩充n个。
参考:C++ STL 中 vector 内存用尽后, 为什么每次是 2 倍的增长, 而不是 3 倍或其他值?
在这里插入图片描述
评论解释的更加清晰
在这里插入图片描述



所属网站分类: 技术文章 > 博客

作者:码神

链接:http://www.javaheidong.com/blog/article/207313/be412f174ccb5f332261/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

17 0
收藏该文
已收藏

评论内容:(最多支持255个字符)