java中arraylist扩容问题_Arraylist扩容机制[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。
当我们要 add 进第1个元素到 ArrayList 时,elementData.length 为0 (因为还是一个空的 list),因为执行了 ensureCapacityInternal() 方法 ,所以 minCapacity 此时为10。此时,minCapacity – elementData.length > 0成立,所以会进入 grow(minCapacity) 方法。
当add第2个元素时,minCapacity 为2,此时e lementData.length(容量)在添加第一个元素后扩容成 10 了
直到添加第11个元素,minCapacity(为11)比elementData.length(为10)要大。进入grow方法进行扩容。扩大成容量的1.5倍
grow() 方法
/**
* 要分配的最大数组大小
*/
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE – 8;
/**
* ArrayList扩容的核心方法。
*/
private void grow(int minCapacity) {
// oldCapacity为旧容量,newCapacity为新容量
int oldCapacity = elementData.length;
//将oldCapacity 右移一位,其效果相当于oldCapacity /2,
//我们知道位运算的速度远远快于整除运算,整句运算式的结果就是将新容量更新为旧容量的1.5倍,
int newCapacity = oldCapacity + (oldCapacity >> 1);
//然后检查新容量是否大于最小需要容量,若还是小于最小需要容量,那么就把最小需要容量当作数组的新容量,
if (newCapacity – minCapacity < 0)
newCapacity = minCapacity;
// 如果新容量大于 MAX_ARRAY_SIZE,进入(执行) `hugeCapacity()` 方法来比较 minCapacity 和 MAX_ARRAY_SIZE,
//如果minCapacity大于最大容量,则新容量则为`Integer.MAX_VALUE`,否则,新容量大小则为 MAX_ARRAY_SIZE 即为 `Integer.MAX_VALUE – 8`。
if (newCapacity – MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/134685.html原文链接:https://javaforall.cn
相关文章
- java局域网发送文件_Java如何实现局域网文件传输代码案例分享
- java 怎样卸载一个类_Java 动态卸载类[通俗易懂]
- java random函数用法_JAVA的Random类的用法详解[通俗易懂]
- Java删除文件(delete file in java)[通俗易懂]
- java calendar 设置小时_Java Calendar.set 方法设置时间的问题
- java pfx 证书_Java将pfx证书转换为jks[通俗易懂]
- java 堆栈的声明_Java 堆栈[通俗易懂]
- java数组去重_JAVA数组去重常用方法
- java 字符数组 合并_字符数组合并?c数组合并?java数组合并问题「建议收藏」
- 手机版java编译器_Java编译器[通俗易懂]
- java 读取字符串文件_Java读取文件为字符串
- java 优先级队列_JAVA 队列
- java notifyall_Java Thread notifyAll()方法[通俗易懂]
- N皇后问题_Java递归解决N皇后问题
- (Java实现) N皇后问题[通俗易懂]
- n皇后问题c语言代码_求n的阶乘java代码
- Java类加载问题汇总
- java解释器虚拟机-Java代码如何运行在Java虚拟机中
- 运筹学教学|运输问题代码分享(Java代码及详细注释)
- java并发编程(1):Java多线程-基本线程类-基础知识复习笔记
- Java 连接 MySQL 数据库简易实现(java连mysql)
- 技术的融合突破极限:Java与Redis的技术融合(java与redis)
- Oracle与Java: 未来前瞻(oracle与java)
- 处理解决Redis Java中过期数据问题(redisjava过期)
- Java编程操作Oracle数据库(java读oracle)
- Java存入Oracle数据库实现快速高效的数据存储(java存入oracle)