当前位置: 首页 > 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编译环境
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • egg(89)--egg之redis的发布和订阅
  • Git学习与使用心得(1)—— 初始化
  • Java小白进阶笔记(3)-初级面向对象
  • Linux gpio口使用方法
  • SpiderData 2019年2月13日 DApp数据排行榜
  • SQL 难点解决:记录的引用
  • 第2章 网络文档
  • 老板让我十分钟上手nx-admin
  • 如何在 Tornado 中实现 Middleware
  • 使用docker-compose进行多节点部署
  • 微服务框架lagom
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 说说我为什么看好Spring Cloud Alibaba
  • 通过调用文摘列表API获取文摘
  • ( 10 )MySQL中的外键
  • (windows2012共享文件夹和防火墙设置
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (区间dp) (经典例题) 石子合并
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (算法)求1到1亿间的质数或素数
  • (译) 函数式 JS #1:简介
  • (转) Face-Resources
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • (转载)hibernate缓存
  • ..回顾17,展望18
  • /*在DataTable中更新、删除数据*/
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [AutoSar NVM] 存储架构
  • [C++数据结构](22)哈希表与unordered_set,unordered_map实现
  • [C++随笔录] 红黑树
  • [IE9] IE9 RC版下载链接
  • [Java][Android][Process] 暴力的服务能够解决一切,暴力的方式运行命令行语句
  • [LeetCode]-Pascal's Triangle III 杨辉三角问题
  • [MT8766][Android12] 取消WIFI热点超过10分钟没有连接自动关闭设定
  • [one_demo_10]递归解决汉诺塔问题
  • [SetContextPropertiesRule]{Context} Setting property 'source'
  • [Spring Boot 3] 整合NoSQL与构建RESTful服务