当前位置: 首页 > news >正文

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,如下所示:

在这里插入图片描述

相关文章:

  • 数据挖掘,计算机网络、操作系统刷题笔记36
  • 如何在IDEA中使用Maven构建Java项目?Maven的使用详细解读
  • 【stl -- 常用算法】
  • python图像处理(图像缩放)
  • 电商项目之同一笔单多次收款成功
  • OpenFeign总结
  • 【Linux】基础IO --- 系统级文件接口、文件描述符表、文件控制块、fd分配规则、重定向…
  • 计算机网络01_---软考高级系统架构师010
  • 【Linux】冯诺依曼体系结构与操作系统概念理解
  • 【c语言进阶】枚举与联合体的基本知识大全
  • Python与Matlab混合编程案例
  • 排列的时候如何避免重复?
  • 芒果改进YOLOv5系列:原创结合Conv2Formers改进结构,Transformer 风格的卷积网络视觉基线模型,超越ConvNeXt结构
  • 利用Windows系统服务进行权限提升
  • WebAssembly编译之(2)-Ubuntu搭建WASM编译环境
  • 230. Kth Smallest Element in a BST
  • CentOS7 安装JDK
  • javascript 总结(常用工具类的封装)
  • JS 面试题总结
  • PAT A1120
  • Spring Cloud中负载均衡器概览
  • Theano - 导数
  • underscore源码剖析之整体架构
  • web标准化(下)
  • Zepto.js源码学习之二
  • 笨办法学C 练习34:动态数组
  • 关于for循环的简单归纳
  • 汉诺塔算法
  • 机器学习学习笔记一
  • 警报:线上事故之CountDownLatch的威力
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • - 转 Ext2.0 form使用实例
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)VC++中ondraw在什么时候调用的
  • .NET Micro Framework 4.2 beta 源码探析
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .net解析传过来的xml_DOM4J解析XML文件
  • /bin/rm: 参数列表过长"的解决办法
  • @property括号内属性讲解
  • @RunWith注解作用
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [ajaxupload] - 上传文件同时附件参数值
  • [c++] C++多态(虚函数和虚继承)
  • [Go WebSocket] 多房间的聊天室(五)用多个小锁代替大锁,提高效率
  • [hdu2196]Computer树的直径
  • [HNOI2008]Cards
  • [IDF]聪明的小羊
  • [iOS]Win8下iTunes无法连接iPhone版本的解决方法
  • [JS入门到进阶] 前端开发不能写undefined?这是误区!
  • [Oh My C++ Diary]#ifndef / #define / #endif 使用详解