ArrayList扩容机制~

简介: ArrayList扩容机制~
ArrayList()//会使用长度为零的数组
ArrayList(int initialCapacity)//会使用指定容量的数组
public ArrayList(Collection<?extends E>c>//会使用c的大小作为数组容量

假设我们设置一个列表的最初容量为10,如下所示:

ArrayList<Integer> arrayList=new ArrayList<>(10);

使用add方法时,触发的扩容机制:

add(Object o)首次扩容为10,再次扩容为上次的1.5倍

那么当我们给该列表中添加一个元素时,如下所示:

随着我们一直添加,直到该列表存放不下,此时会发生,如下所示:

我们继续添加,此时的容量又无法满足了,继续扩容,但此时的容量大小为15,如果扩容为原来的1.5倍,是不是代表最终容量大小为22.5?

事实并非如此,其容量计算是这样的,先将当前的容量大小右移求出它的一半,再将所得的一半值与当前大小相加

15>>1
7
7+15
22

因此第二次扩容的最终容量大小为22

ArrayList前20次扩容规律如下:

使用addAll方法时,触发的扩容机制:

addAll(Collection c)//没有元素时,扩容为Math.max(10,实际元素个数),有元素时为Math.max(原容量1.5倍,实际元素个数)

当最初容量为0时:

例一:

输出的容量大小为10

例二:

输出的容量大小为11

上述的输出结果让我们很疑惑,为什么不是我们所想的15呢?原因是使用addAll方法时,它在扩容时,当原始容量不够时,它会将下次一定扩容后的容量大小与当前添加元素的个数进行对比,取较大值,例二中的原始容量为0,扩容后的容量为10,但是添加的元素个数为11个,因此,最终的容量大小为11


例三:

由于已存在了10个元素,那么此时容量大小为10,再使用addAll方法进行元素添加时,将扩容的大小为15,添加三个元素后的大小为13,最终的容量大小为15,如下所示:

例四:


由于已存在了10个元素,那么此时容量大小为10,再使用addAll方法进行元素添加时,将扩容的大小为15,添加三个元素后的大小为16,最终的容量大小为16,如下所示:

相关文章
|
前端开发 JavaScript 测试技术
如何制作网页
创建自己的网站涉及多个步骤,从确定主题到最终测试和发布。本文详细介绍了每个步骤:首先明确网站目的和受众;其次设计直观易用的布局;选择符合主题的颜色和字体;撰写清晰简洁的内容;优化加载速度;全面测试功能和兼容性;选择托管服务并注册域名;最后通过SEO、社交媒体和广告进行推广。注意事项包括关注用户体验、学习基本编码知识,并考虑网站的扩展性和可维护性。遵循这些步骤,你将能创建一个美观且实用的网站。
1345 0
|
安全 Java
【Java集合类面试十六】、HashMap与ConcurrentHashMap有什么区别?
HashMap是非线程安全的,而ConcurrentHashMap通过减少锁粒度来提高并发性能,检索操作无需锁,从而提供更好的线程安全性和性能。
|
Java Maven
idea中maven项目pom文件Could not acquire lock(s)
idea中maven项目pom文件Could not acquire lock(s)
8679 2
|
存储 大数据 数据管理
大数据分区提高查询性能
大数据分区提高查询性能
411 2
|
iOS开发 MacOS 内存技术
如何创建可引导的 macOS Sonoma 安装介质
【8月更文挑战第23天】以下是创建可引导的macOS Sonoma安装介质的步骤: 1. 运行macOS的电脑,确保有足够的存储空间和稳定的网络连接。 2. 至少16GB的USB闪存驱动器或外部硬盘,格式化为Mac OS扩展(日志式),并命名为“Installer”。
505 3
|
数据采集 存储 人工智能
【AI 初识】AI 的挑战和局限性
【5月更文挑战第2天】【AI 初识】AI 的挑战和局限性
【AI 初识】AI 的挑战和局限性
|
存储 消息中间件 NoSQL
Redis为什么会这么快?Redis到底有多快?【大厂经典面试题】
Redis为什么会这么快?Redis到底有多快?【大厂经典面试题】
1130 1
|
UED Python
如何使用Pygame的display模块显示文本?
【6月更文挑战第11天】如何使用Pygame的display模块显示文本?
517 6
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的高校教务管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的高校教务管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
326 2
|
机器学习/深度学习 存储 自然语言处理
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)1
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)
849 0
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)1

热门文章

最新文章

下一篇
开通oss服务