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.mzph.cn/news/745447.shtml

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

相关文章

Spring中经典的7种设计模式源码分析

一、工厂模式 Spring使用工厂模式来创建Bean对象,如BeanFactory、ApplicationContext等。工厂模式为bean的创建过程提供了一个框架,同时隔离了实例化细节,使得代码更加解耦。 BeanFactory接口 BeanFactory接口仍然是Spring工厂模式的基础,它定义了获取Bean实例的基本方法。 …

LAMP网站部署(Discuz论坛网站部署)

目录 mysql命令 语法 选项 参数 实例 安装php 安装Mariadb 关掉防火墙和selinux 启动HTTP服务 初始化数据库 查看数据库是否创建成功 修改HTTP的配置文件 浏览器打开 将以下所有目录都加上权限 最后首页效果 mysql命令 是MySQL数据库服务器的客户端工具&#xff0c;它工作在命…

【点云】激光点云建图评测

处理工具 Pcap合并软件 sudo apt install wireshark-common合并Pcap文件&#xff0c;路径为数据文件夹下&#xff0c; #mergecap -w <输出的新Pcap> <输入的Pcap> mergecap -w lidar_output.pcap slice2099-06-01/LIDAR/lidar.pcap slice2099-06-02/LIDAR/lidar…

Java错误:JDBC错误,如何解决和避免

随着Java的广泛应用&#xff0c;Java程序在连接数据库时经常会出现JDBC错误。JDBC&#xff08;Java Database Connectivity&#xff09;是Java中用于连接数据库的编程接口&#xff0c;因此&#xff0c;JDBC错误是在Java程序与数据库交互时遇到的一种错误。下面将介绍一些最常见…

从根到叶:深度理解哈希表

​​​​​​​ 一.哈希表的概念 关于查找元素时&#xff1a; 在顺序结构以及平衡树 中&#xff0c;元素关键码与其存储位置之间没有对应的关系&#xff0c;因此在 查找一个元素时&#xff0c;必须要经过关键 码的多次比较 。 顺序查找时间复杂度为 O(N) &#xff0c;平衡树中…

什么是云计算?应用场景有哪些?

云计算是通过互联网提供计算资源和服务的计算模式&#xff0c;是一种新型的计算模式&#xff0c;能够通过互联网将计算和存储资源进行集中和共享&#xff0c;云计算主要就是把有形的产品&#xff0c;如网络硬件设备、服务器、存储服务器和各种软件等转化成服务产品&#xff0c;…

Acwing-基础算法课笔记之动态规划(背包问题)

Acwing-基础算法课笔记之动态规划&#xff08;背包问题&#xff09; 一、01背包问题1、概述2、过程模拟 二、完全背包问题1、概述2、闫氏dp分析完全背包问题3、过程模拟代码模板 三、多重背包问题1、概述2、过程模拟3、多重背包问题的优化版本 分组背包问题1、概述2、过程模拟3…

postgresql 批量添加数据,存在则更新,不存在则插入

语句介绍: DO NOTHING&#xff1a;当记录存在时&#xff0c;什么都不做 DO UPDATE SET column_1 value_1, … WHERE condition&#xff1a;当记录存在时&#xff0c;更新表中的一些字段 实例语句&#xff1a; name默认为主键 存在则更新&#xff0c;不存在则插入 INSERT I…

Rockchip android7.1.2 强制第三方apk横屏显示

Rockchip android7.1.2 强制第三方apk横屏显示 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip OS:Android 7.1.2 Kernel: 3.10 问题描述 目前市面上&#xff0c;apk有三种形…

修改vscode的相对路径计算逻辑

vscode的相对路径计算逻辑是&#xff0c;"./"表示当前项目的文件夹&#xff0c;而不是当前文件所在的文件夹 做出如下修改&#xff1a; File-->Preferences-->settings 搜索Execute in File Dir , 然后取消勾选

粒子群算法对pi控制器进行参数优化,随时优化pi参数以控制直流无刷电机转速。

粒子群算法对pi控制器进行参数优化&#xff0c;随时优化pi参数以取得设定直流无刷电机转速。 PSO优化PID&#xff0c;用于BLDC速度控制 仿真平台为&#xff1a;MATLAB 采用的是Simulinkm程序相配合 仿真结果以及程序示例&#xff1a;

如何配置Apache的反向代理

目录 前言 一、反向代理的工作原理 二、Apache反向代理的配置 1. 安装Apache和相关模块 2. 配置反向代理规则 3. 重启Apache服务器 三、常见的使用案例 1. 负载均衡 2. 缓存 3. SSL加密 总结 前言 随着Web应用程序的不断发展和扩展&#xff0c;需要处理大量的请求和…

Excel第26享:模糊查找之Hlookup函数与通配符的嵌套

1、需求描述 如下图所示&#xff0c;现第一行有三个参考值&#xff1a;人S、羊E、猪3&#xff0c;在第三行有5个字&#xff1a;马、牛、人、羊、猪&#xff0c;每个字如果出现在第一行的三个参考值中&#xff0c;就返回该单元格的数值。如&#xff0c;人&#xff0c;就返回“人…

Lucene查询语法,适用于 ELk Kibana 查询

Lucene查询语法&#xff0c;适用于 ELk Kibana 查询 Elasticsearch 构建在 Lucene 之上&#xff0c;过滤器语法和 Lucene 相同。本语法可用于 Kibana 界面的检索和 Grafana 看板对接 ES 的检索规则。 Kibana 上的检索语法Grafana 上的检索语法 全文搜索 在搜索栏输入login&…

【SpringCloud微服务实战08】RabbitMQ 消息队列

MQ异步通信优缺点: 优点: 吞吐量提升:无需等待订阅者处理完成,响应更快速 故障隔离:服务没有直接调用,不存在级联失败问题 调用间没有阻塞,不会造成无效的资源占用 耦合度极低,每个服务都可以灵活插拔,可替换 流量削峰:不管发布事件的流量波动多大,都由Broker接收,…

Redis-复制功能

0 序言 复制功能是Redis提供的多机功能中最基础的一个&#xff0c;这个功能是通过主从复制&#xff08;master-slave replication&#xff09;模式实现的&#xff0c;它允许用户为存储着目标数据库的服务器创建出多个拥有相同数据库副本的服务器&#xff0c;其中存储目标数据库…

数据流的中位数

优质博文IT-BLOG-CN 一、题目 中位数是有序整数列表中的中间值。如果列表的大小是偶数&#xff0c;则没有中间值&#xff0c;中位数是两个中间值的平均值。 【1】 例如arr [2,3,4]的中位数是3。 【2】例如arr [2,3]的中位数是(2 3) / 2 2.5。 实现MedianFinder类: 【1】M…

GPT如何做角色扮演,prompt示例大放送

文末有完整版角色扮演提示词。 角色扮演在AI提示词中有着至关重要的作用。 无论结构化指令,还是文本格式指令,角色扮演都是很实用也是比较容易上手的提示词的重要组成部分。 我们可以通过让ChatGPT扮演特定的角色,来获得更加贴合需求的、具有特定视角和专业知识背景的答案…

​LLM之新手入门:大预言模型的概念介绍与应用

最近&#xff0c;我在系统地学习大型语言模型&#xff08;LLM&#xff09;的相关知识。在这个学习过程中&#xff0c;我努力将所学的内容整理成博客文章。在这篇博客中&#xff0c;我首先简要介绍了人工智能的发展历史&#xff0c;然后探讨了大型模型的基本原理、训练方法、微调…

Linux系列

安装系列 1.MySQL安装 我们要通过rpm&#xff0c;进行MySQL数据库的安装&#xff0c;主要的步骤如下&#xff1a; rpm -qa 查询当前系统中安装的所有软件 rpm -qa | grep mysql 查询当前系统中安装的名称带mysql的软件 rpm -…