关于Java的ArrayList数组自动扩容机制
作者:逆流°只是风景-bjhxcc 时间:2021-11-26 13:12:46
ArrayList介绍
ArrayList底层是基于数组实现的,是一个动态数组,自动扩容。
ArrayList不是线程安全的,只能用在单线程环境下。
实现了Serializable接口,因此它支持序列化,能够通过序列化传输;
实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问;
实现了Cloneable接口,能被克隆。
动态扩容
初始化
JDK1.7通过无参构造方法(初始长度默认10,以默认的大小来初始化内部的数组)、有参构造方法对数组进行初始化。
确保内部容量
通过判断,如果够则不进行操作;容量不够就扩充来确保内部容量。
1. ensureCapacityInternal方法名的英文大致是“确保内部容量”,size表示的是执行添加之前的元素个数,并非ArrayList的容量,容量应该是数组elementData的长度。ensureCapacityInternal该方法通过将现有的元素个数数组的容量比较。看如果需要扩容,则扩容。
2. 是将要添加的元素放置到相应的数组中。
根据传入的最小需要容量minCapacity来和数组的容量长度对比,如果minCapacity大于或等于数组容量,则需要进行扩容。
扩容
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
// jdk1.7采用位运算比以前的计算方式更快
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//jdk1.7这里增加了对元素个数的最大个数判断,MAX_ARRAY_SIZE 为int最大值减去8。
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
// 最重要的复制元素方法 Arrays.copyOf()
elementData = Arrays.copyOf(elementData, newCapacity);
}
综述:ArrayList在第一次插入元素add()时分配10(默认)个对象空间。假如有20个数据需要添加,那么会在第11个数据的时候(原始数组容量存满时),按照1.5倍增长;
之后扩容会按照1.5倍增长(10、15、22、、、)。
每次扩容都是通过Arrays.copyOf(elementData, newCapacity) 这样的方式实现的。ArrayList的自动扩容机制底层借助于System实现System.arraycopy(0,oldsrc,0,newsrc,length);
来源:https://writer.blog.csdn.net/article/details/128564620
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
java实战之桌球小游戏
![](https://img.aspxhome.com/file/2023/6/66986_0s.jpg)
Java并发包线程池ThreadPoolExecutor的实现
![](https://img.aspxhome.com/file/2023/3/64383_0s.jpg)
Java实现登录与注册页面
![](https://img.aspxhome.com/file/2023/1/61001_0s.jpg)
C#与C++ dll之间传递字符串string wchar_t* char* IntPtr问题
导入maven项目各个注解均报错的解决方案
![](https://img.aspxhome.com/file/2023/0/71820_0s.jpg)
java开源项目jeecgboot的超详细解析
![](https://img.aspxhome.com/file/2023/7/71677_0s.png)
maven手动上传jar包示例及图文步骤过程
![](https://img.aspxhome.com/file/2023/1/59571_0s.png)
idea 创建properties配置文件的步骤
![](https://img.aspxhome.com/file/2023/8/59368_0s.jpg)
Java常量池知识点总结
![](https://img.aspxhome.com/file/2023/2/66712_0s.png)
Java实现显示指定类型的文件
![](https://img.aspxhome.com/file/2023/5/62675_0s.png)
springboot 自定义异常并捕获异常返给前端的实现代码
![](https://img.aspxhome.com/file/2023/5/71625_0s.png)
Java实现答答租车系统
![](https://img.aspxhome.com/file/2023/9/61579_0s.jpg)
springboot+mybatis-plus 两种方式打印sql语句的方法
![](https://img.aspxhome.com/file/2023/9/64379_0s.jpg)
Java实现远程控制技术完整源代码分享
![](https://img.aspxhome.com/file/2023/3/68003_0s.jpg)
springboot使用redis实现从配置到实战
java注解的类型知识点总结
HttpsURLConnection上传文件流(实例讲解)
使用@Validated 和 BindingResult 遇到的坑及解决
![](https://img.aspxhome.com/file/2023/3/64223_0s.png)