【Java】Java ArrayList自动扩容机制
2023-09-14 09:05:05 时间
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);
相关文章
- 深入理解 Java 对象的内存布局
- 反应java程序并行机制的特点_Java语言具有许多优点和特点,下列选项中能反映Java程序并行机制特点的是()。…[通俗易懂]
- 手机java程序_2020年最流行的Java开发技术
- java中文乱码_Java中文乱码问题的解决方案[通俗易懂]
- java实现ajax_Ajax&Java
- JAVA-常用API之StringBuilder
- java 汉字乱码_Java中文乱码问题
- java清除session_退出页面自动清除java session方法
- java dom4j生成xml格式化_Java DOM4J方式生成XML的方法「建议收藏」
- 【说站】java委托事件模型的使用
- java arraydeque poll,Java ArrayDeque「建议收藏」
- java 设置400错误_Java项目报400错误的原因与解决方法
- 【Android 安全】DEX 加密 ( Java 工具开发 | apk 文件对齐 )
- Java面试:责任链模式
- 如何实现Java程序发送邮件详解程序员
- java操作oracle常用的示例代码详解编程语言
- Java操作MySQL数据库快速入门(java访问mysql)
- Java与MySQL的实现协同(java和mysql)
- Java 与 Linux 的结合:开启新时代(java和linux)
- 使用Java在Linux系统上开发:一步步安装全部组件(java环境linux)
- 深入Linux环境下Java应用调试实践(linux调试java)
- 自动提交MySQL事务中的Java自动提交实践(mysql事务java)
- Linux下配置Java开发环境的指南(linux配置java环境)
- Java学习Linux基础的必要性(java要学linux)
- 应用『Java应用程序中Redis缓存的使用』(redis缓存与java)
- 机制使用Redis Java过期机制实现自动清理(redisjava过期)
- 机制使用Redis Java实现自动过期机制(redisjava过期)
- 如何使用Java备份Oracle数据库?(java备份oracle)
- 数据库以Java运行环境构建基于Oracle的数据库(java创建oracle)
- JS自定义对象实现Java中Map对象功能的方法