ArrayList底层是用数组实现,但数组长度是有限的,如何实现扩容?

简介: ArrayList底层是用数组实现,但数组长度是有限的,如何实现扩容?

ArrayList底层是用数组实现,但数组长度是有限的,如何实现扩容?


当新增元素,ArrayList放不下该元素时,触发扩容。 扩容的容量将会是原容量的1/2,也就是新容量是旧容量的1.5倍。

private void grow(int minCapacity) { 
  int oldCapacity = elementData.length; 
  //新容量=旧容量+1/2旧容量 
  int newCapacity = oldCapacity + (oldCapacity >> 1); 
  if (newCapacity - minCapacity < 0) 
    newCapacity = minCapacity; 
  if (newCapacity - MAX_ARRAY_SIZE > 0) 
    newCapacity = hugeCapacity(minCapacity); 
  elementData = Arrays.copyOf(elementData, newCapacity); 
}

执行扩容时使用系统类System的数组复制方法arraycopy()进行扩容。

扩容的源码:

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) { 
  @SuppressWarnings("unchecked") 
  T[] copy = ((Object)newType == (Object)Object[].class) 
  ? (T[]) new Object[newLength] 
  : (T[]) Array.newInstance(newType.getComponentType(), newLength);
   System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength)); 
   return copy; 
}
相关文章
|
网络协议 Shell Linux
【Shell 命令集合 网络通讯 】Linux 创建网络连接 nc命令 使用教程
【Shell 命令集合 网络通讯 】Linux 创建网络连接 nc命令 使用教程
651 1
|
存储 Java
ArrayList自动扩容(详细篇)
ArrayList自动扩容(详细篇)
791 1
|
新零售 人工智能 Cloud Native
【年度重磅】阿里淘系全年技术总结黑皮书,1500页免费下载!
淘系技术将2020一整年的精华内容梳理合并,重磅推出【淘系技术2020技术年货】。在这本书中,你将看到:各技术栈下时新前沿的技术讲解与方法技巧、淘系技术大牛的职场成长经验&学习问答实录、年度精选技术人员必读书单、淘系经典开源项目介绍、2020淘系顶会 paper 全文。
47521 0
【年度重磅】阿里淘系全年技术总结黑皮书,1500页免费下载!
|
5月前
|
存储 数据采集 NoSQL
什么是数据仓库?数据库与数据仓库有什么关系?
数据仓库与数据库有何区别?数据仓库主要用于存储历史数据,支持企业分析决策;而数据库则负责管理实时业务数据,保障日常运作。两者在数据来源、处理方式、存储结构等方面差异显著,但又相辅相成,共同助力企业高效管理数据、提升运营与决策能力。
|
监控 JavaScript 前端开发
ARMS的移动应用监控
【8月更文挑战第23天】
291 6
|
机器学习/深度学习 人工智能 Anolis
手把手教学攻略:在Anolis OS上部署OpenVINO深度学习模型
Anolis OS 作为国内首个正式提供 OpenVINO 开发包和镜像的服务器端操作系统,推动国内 AI 推理生态和能力的升级。
|
机器学习/深度学习 算法 人机交互
|
Linux Anolis 芯片
centos升级龙蜥
centos升级龙蜥
1181 0
|
存储 机器学习/深度学习 人工智能
基于 SRAM 的存内计算助力实现节能 AI
基于 SRAM 的存内计算助力实现节能 AI
|
XML Java Maven
Invalid bound statement (not found)
Invalid bound statement (not found)
222 0