关于ArrayList的初始容量以及扩容的效率问题

Jetpack Compose Navigation实战:从基础到高级导航模式 本文全面解析Jetpack Compose Navigation在Android开发中的应用,从基础导航实现到高级模式(如单任务/单顶模式),涵盖参数传递、嵌套导航、深层链接等核心功能。通过实战代码示例展示如何优化导航性能,并与ViewModel、Hilt等架构组件整合,为开发者提供高效的Compose导航解决方案。 阅读详情

论坛的一个问题:

有这样一段很简单的代码:
ArrayList <DataVO> a = new ArrayList <DataVO>();

a.addAll(b);
a.addAll(c);

其中DataVO是一个实体类,b和c都是一个ArrayList <DataVO>类型。
如果当b,c数据量很大的时候,请问这样一段代码是不是会很影响效率?

 

 

我们看一下ArrayList的源代码

可见默认的构造器,其调用了参数为10的构造函数

这个带参数的构造函数,初始化了一个长度为初始容量的数组。

 

再看看add方法

这里面的第一行,就是确信当前容量是否能容下新增加的对象

此方法里,一旦发现容量不足,会自动扩充容量,新的大小是

也就是原有容量的1.5倍+1。然后通过底层的复制方法将原有数据复制过来

 

 

总结:

    如果数据量很大,那么造成数组重新分配的次数会增加,但对于一般的数据量下,

1千需要分配 11次

1万一级需要分配17次

10万 需要分配23次

100万需要分配28次

 

所以,大家根据实际情况,大致分配一个初始化的容量还是有必要的。但是如果你初始容量太大,而数据增长很慢,那么就在浪费内存了。

如何取舍,还是看具体的应用场景了。

 

STM32 SAI接口TDM模式实战:8通道音频采集系统搭建全流程(附DMA配置代码) 本文详细介绍了基于STM32 SAI接口TDM模式搭建8通道音频采集系统的全流程。内容涵盖硬件连接设计、CubeMX时钟树与SAI外设的详细配置,并重点解析了TDM模式的核心代码实现与DMA双缓冲机制,提供了完整的配置代码和常见时序问题排查指南,助力开发者高效实现多通道音频传输与处理。 阅读详情

相关推荐

解决AutoDock与Python版本冲突导致的内存泄漏问题:从BHtree *错误到环境配置优化

本文深入解析了AutoDock分子对接中常见的‘BHtree *’内存泄漏错误,其根源在于SWIG接口模块与Python运行环境的版本不匹配。文章提供了根治方案:通过构建Python 2.5.4与MGLTools 1.5.6的黄金兼容组合,并详细指导环境清理、安装配置及实战测试,从而彻底解决该内存泄漏问题,确保AutoDock工作流的稳定运行。

g5h6i的博客 1115

ArrayList扩容问题

基于JDK1.8版本  ArrayList底层是基于数组实现的,  其不是线程安全的,只能用在单线程环境下。  实现了Serializable接口,因此它支持序列化,能够通过序列化传输;  实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问;  实现了Cloneable接口,能被克隆。 public class ArrayList&lt;E&gt; ex...

大灰狼的专栏 1万+

USB-Type-C PCB布局布线设计规范

USB Type-C连接器有24个引脚。图1和图2分别显示了USB Type-C插座和插头的插针。母头/母座公头/插头可以很明显看出,插口内的Pin功能相对于中心对称。公头插入母头,无论正反插,引脚功能都完美契合。而且电源VBUS/GND都拥有4个Pin,最大支持5A电流,在保证高速数据传输的同时也提高了电流承载能力。表 1 和表 2 分别汇总了在 USB Type-C 型插座和插头上所使用的信号列表。

weixin_63005522的博客 8286

送分题,ArrayList 的扩容机制了解吗?

最近在准备暑期实习嘛,所以面经刷的比较多,前几天看见一位上岸的小伙伴写的面经,他说他在整理回顾知识点的时候(一般都用思维导图吧),会把知识点写成疑问句的形式,而不是陈述句,这样你在看到这句...

HollisChuang's Blog 2062

Apache Hop环境搭建实战:从零到一的下载、安装与配置指南

本文详细介绍了Apache Hop环境搭建的全过程,包括下载、安装与配置指南。从选择正确的JDK17版本到设置关键环境变量,再到启动GUI界面和解决常见问题,提供了全面的实战指导。适合数据工程师和ETL开发者快速上手这一强大的数据集成工具。

weixin_42634811的博客 576

Unity3D 2022版如何一键安装Newtonsoft.Json?最新Package Manager教程

本文详细介绍了在Unity3D 2022及以上版本中,如何通过Package Manager一键安装和配置Newtonsoft.Json(Json.NET)。教程涵盖了从打开Package Manager、搜索并安装正确包源,到验证安装和基础使用的完整流程,旨在帮助开发者以现代化、可靠的方式集成这一强大的JSON处理框架,提升开发效率并规避手动导入的常见问题。

lg888的博客 921

数组的增删改查和扩容

public class Array { private E[] data; private int size; //构造函数,传入数组的容量capacity构造Array public Array(int capacity) { data =(E[]) new Object [capacity]; size = 0; } //无参构造函数,默认数组的容量capacity = 10 public ...

DramaLifes的博客 294

世界模型(World Models)进展全景调研(截至 2025-08)

A5) 2019-07(待核验) | C-SWM:Contrastive Structured World Models(Kipf et al.)A6) 2019-07(待核验) | SLAC:Stochastic Latent Actor-Critic(Lee et al.)A3) 2015-12(背景注记,待核验) | Embed to Control(E2C,Watter et al.)Nature 2020)Repro/Code:werner-duvaud/muzero-general(社区)

u013250861的博客 489

常见集合初始默认值大小及其扩容

(为何是16:16是2^4,可以提高查询效率,另外,32=16<<1 -->至于详细的原因可另行分析,或分析源代码)Vector:线程安全,但速度慢,底层数据结构是数组结构,当 元素个数 超过 容量长度 时,进行扩容,扩容大小为原容量的 1倍。ArrayList:线程不安全,查询速度快,底层数据结构是数组结构,扩容大小为原容量的 1.5倍。如 HashSet的容量为16,一次扩容后是容量为32。如 HashMap的容量为16,一次扩容后是容量为32。扩容增量:原容量的 1 倍。

sjkcko的博客 1110

华为OD机试 - 战士技能规划设计 - 数组(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。你为一款动作游戏设计战士角色的技能:战士每个技能会消耗不同能量,释放技能有 2 个约束:连续释放技能数量不能超过 m 个,技能能量总和不能超过能量上限 k;如果超过则必须中断当前技能,进入调息状态(即分段)。战士有一项爆发技巧:在单次战斗中有一次

学Java,找哪吒 237

华为OD新系统机试真题 - 失灵的键盘(C/C++/Py/Java/Js/Go)

华为OD新系统机试真题 【失灵的键盘】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD4月15号机试真题【失灵的键盘】

qq_45776114的博客 1072

ArrayList扩容机制(原理)

ArrayList扩容机制(原理)

weixin_47796247的博客 1万+

【Mode】微带传输线阻抗

微带线,英文名称为 (Microstrip) 是一种常见的平面传输线,主要用于传输微波频率信号(通常在射频和微波电路重中使用)。

u011699626的博客 245

初始容量问题

ArrayList 的构造问题: 1 构造指定容量的对象 2 构造empty对象 3 从一个Collection构造对象看前两个,默认构造和带容量构造。看过源码后可以发现。 不指定容量的话,默认构造一个length是10的Object数组(JDK8是一个空数组)。 然后每add一次,判断是不是需要扩容了。是的话,扩1/2。为方便计算我们假设可以声明的数组的最大长度是21亿整,大于21亿就认

oZhangZhen的博客 681

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

List、Map、Set默认初始容量和扩容增量及加载因子

1、概念解读 初始容量,就是创建时可容纳的默认元素个数; 加载因子,表示某个阀值,用0~1之间的小数来表示,当已有元素占比达到这个阀值后,底层将进行扩容操作; 扩容方式,即指定每次扩容后的大小的规则,比如翻倍等。当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率...

weixin_42184707的博客 4206

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

集合4_扩容机制(ArrayList 与LinkedList)

ArrayList 1、ArrayList注意事项 1、允许所有的元素,包括null,且ArrayList可以加入多个null 2、ArrayList由数组来实现数据存储 3、ArrayList线程不安全,在线程操作时不建议使用Vector 2、ArrayList扩容机制 1)ArrayList 底层维护一个Object 类型的数组elementDate, transient Object elementDate[]; ArrayList提供三种构造函数,介绍其中的两种 public ArrayList(

m0_50898124的博客 494

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

CS61B - Data Structure 课程 ArrayList 扩容+JAVA对象游离

CS61B - Data Structure 课程 ArrayList 扩容+JAVA对象游离

qq_41758969的博客 356

java-浅学ArrayList

浅学ArrayList,了解其扩容机制

Yide-Chan的博客 268

ArrayList源码分析、与LinkedList区别

ArrayList 是动态数组的数据结构实现、LinkedList 是双向链表的数据结构实现

m0_52225681的博客 139

ArrayList源码

1.ArrayList创建时,是一个容量为10的数组2.扩容1.5倍,速度最快3.直接在数组末尾添加元素,所以有序、可重复4.查询时直接通过下标,所以快5.增删时需要自己复制自己,所以慢6.转数组其实是复制到新数组返回。

m0_59684747的博客 599

java 集合底层_java基础集合底层介绍

这里要讨论这些常用的默认初始容量和扩容的原因是:当底层实现涉及到扩容时,容器或重新分配一段更大的连续内存(如果是离散分配则不需要重新分配,离散分配都是插入新元素时动态分配内存),要将容器原来的数据全部复制到新的内存上,这无疑使效率大大降低。加载因子的系数小于等于1,意指 即当 元素个数 超过容量长度*加载因子的系数时,进行扩容。另外,扩容也是有默认的倍数的,不同的容器扩容情况不同。List元...

weixin_35316606的博客 344

Java 集合框架:ArrayList 深度解析与实战优化

动态扩容:无需手动管理数组长度,开发便捷。随机访问高效:基于数组,get操作时间复杂度 O (1) ,适合频繁查询场景。

huashanming的博客 868

【JavaSE】【集合】ArrayList & Vector

ArrayList 1. ArrayList的无参构造 public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } 知识点1: 底层是Object数组 知识点2: 通过无参构造创建的ArrayList,其底层存储结构是一个缓存在方法区的空数组 知识点3: 为了避免我们反复的创建无用数组,所有通过无参构造new出来的ArrayList底层数组都指向缓存在方法区里的Object[]数组 知识点4: .

weixin_43589563的博客 171
上一篇: 通过Socket实现群聊的思路
下一篇: Java如何每5秒生成一个随机数
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 16
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值