ArrayList 是如何进行扩容的?

典型回答

ArrayList 在添加元素时,会自动进行扩容操作,它的执行步骤如下:

  1. 当 ArrayList 的内部数组空间不足以容纳新增的元素时,会触发扩容机制。
  2. ArrayList 会创建一个新的更大的数组,通常是当前数组长度的 1.5倍 (可以通过 ensureCapacity 方法手动调整容量)。
  3. 然后,ArrayList 会将原数组中的元素逐个复制到新数组中,以保持元素的顺序。
  4. 扩容完成后,修改 ArrayList 变量的引用为新数组的引用。

所以,当需要添加大量元素时,可以考虑在创建 ArrayList 时直接指定初始容量,这样可以减少扩容次数,提高效率。

使用 ensureCapacity 调整容量的代码如下:

import java.lang.reflect.Field;
import java.util.ArrayList;public class ArrayListCapacityDemo {public static void main(String[] args) {ArrayList<Integer> numbers = new ArrayList<>(10);numbers.add(5);numbers.add(10);numbers.add(15);System.out.println("当前实际容量: " + numbers.size());System.out.println("当前总容量: " + getArrayListCapacity(numbers));// 使用 ensureCapacity 方法增加容量numbers.ensureCapacity(20);System.out.println("扩容后的实际容量: " + numbers.size());System.out.println("扩容后的总容量: " + getArrayListCapacity(numbers));try {// 通过反射获取 ArrayList 总容量// JDK 8+ 需要设置以下 JVM 参数:// --add-opens java.base/java.lang=ALL-UNNAMED// --add-opens java.base/java.util=ALL-UNNAMED// --add-opens java.base/java.nio=ALL-UNNAMED// --add-opens java.base/sun.nio.ch=ALL-UNNAMEDSystem.out.println("通过反射获取 ArrayList 总容量: " + getArrayListCapacityReflection(numbers));} catch (NoSuchFieldException | IllegalAccessException e) {e.printStackTrace();}}private static int getArrayListCapacity(ArrayList<?> arrayList) {return arrayList.toArray().length;}private static int getArrayListCapacityReflection(ArrayList<?> arrayList) throws NoSuchFieldException, IllegalAccessException {Field dataField = ArrayList.class.getDeclaredField("elementData");dataField.setAccessible(true);Object[] elementData = (Object[]) dataField.get(arrayList);return elementData.length;}
}

以上程序的运行结果如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/539538.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka-生产者报错javax.management.InstanceAlreadyExistsException

生产者发送消息到 kafka 中,然后控制台报错 然后根据日志查看 kafka 的源码发现了问题原因 说的是MBean已经注册了,然后报异常了,这样就会导致生产者的kafka注册失败, 原因是项目上生产者没有配置clientId,默认都是空导致的, 多个生产者(项目)注册到kafka集群中的 id 都相同。 …

Maven3.6.3安装与配置,IDEA2022.2.3部署Maven操作步骤

1、先确保安装了Java开发环境&#xff0c;并配置了JAVA_HOME环境变量 WinR ,输入cmd,然后输入命令echo %JAVA_HOME%,查看JDK &#xff0c;接着输入java -version,查看java的版本号 接着系统变量中&#xff0c;配置JAVA_HOME环境变量 2、官网下载MAVEN3.6.3&#xff0c;Maven3.…

【计算机网络】概述 习题

体系结构 练习题 体系结构 真题 时延相关习题 参考公式&#xff1a; 习题1 题解&#xff1a; 发送时延1b 然后通过传播时延传到对面。即1b的发送时延剩下的传播时延 习题1扩展&#xff1a; 将距离修改为20米&#xff0c;其他条件不变。 将距离修改为10米&#xff0c;其他条…

sqllab第二十二关通关笔记

知识点&#xff1a; cookie注入报错注入 直接抓取对应的数据包&#xff0c;发现还是一个cookie注入 参数值被base64加密了 测试这里使用什么手段读取输入 构造payload:uname1 base64加密&#xff1a;MSc 出现了hacker的页面&#xff0c;说明信息错误但是单引号没起作用 使…

Node.js入门基础—day01

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;给自己一个梦想&#xff0c;给世界一个惊喜。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章目录 初识node.js什…

【Redis】Redis常用命令之Hash

1.hset&#xff1a;设置hash中指定的字段&#xff08;field&#xff09;的值&#xff08;value&#xff09;。 HSET key field value [field value ...]时间复杂度&#xff1a;插⼊⼀组field为O(1),插⼊N组field为O(N)。 返回值&#xff1a;添加的字段的个数。 2.hget&#xf…

爬虫逆向实战(35)-MyToken数据(MD5加盐)

一、数据接口分析 主页地址&#xff1a;MyToken 1、抓包 通过抓包可以发现数据接口是/ticker/currencyranklist 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现有一个code参数 请求头是否加密&#xff1f; 无 响应是否加密&#xf…

GPT-4.5 Turbo:意外曝光且可能在六月份推出

国外网络媒体THE DECODER的联合创始人兼出版人Matthias认为&#xff0c;人工智能技术将彻底改变人类和计算机的互动方式。最新消息显示&#xff0c;OpenAI的最新力作GPT-4.5 Turbo已经在网络上意外曝光。首批发现此信息的是Bing和DuckDuck Go等搜索引擎&#xff0c;它们在官方发…

3/14/24数据结构、线性表

目录 数据结构 数据结构三要素 逻辑结构 存储结构 数据运算 时间复杂度 空间复杂度 线性表 线性表定义 静态分配 动态分配 线性表插入 线性表删除 十天的时间学完了C语言督学课程&#xff0c;最后终于是可以投入到408的科目学习当中。关于数据结构和算法的学习很多部…

LeetCode2115. 从给定原材料中找到所有可以做出的菜

拓扑排序 题面 题目链接&#xff1a;2115. 从给定原材料中找到所有可以做出的菜 - 力扣&#xff08;LeetCode&#xff09; 你有 n 道不同菜的信息。给你一个字符串数组 recipes 和一个二维字符串数组 ingredients 。第 i 道菜的名字为 recipes[i] &#xff0c;如果你有它 所有…

基于raft的kvDB

0 CAP理论 0.1 指标 0.1.1 一致性&#xff08;consistency&#xff09; 客户端每次读操作&#xff0c;不管访问哪个节点&#xff0c;要么读到最新写入的数据&#xff0c;要么读取失败。一致性强调数据正确。 0.1.2 可用性(availability) 不管访问哪个非故障节点&#xff0…

基于uniapp的旅游景点入园预约系统 微信小程序0220o

技术要求&#xff1a; a) 操作系统&#xff1a;Windows、Linux等&#xff1b; b) 开发工具&#xff1a;Android Studio、pycharm等&#xff1b; c) 数据库&#xff1a;Oracle、MySQL等&#xff1b; d) 开发语言&#xff1a;python&#xff1b; e) 技术框架&#xff1a;采用MVC模…