最新要闻
- 全球最大的红宝石拍卖价格高达2.48亿 创下有史以来最高纪录
- 保时捷发布其纯电概念hypercar 马力或将达到惊人的1500匹
- 伏罂而听的故事声音主要是借助于什么传入侦察兵的耳朵_伏罂而听的成语故事
- 福特回应称没有计划终止福特电马赫公司运营 或有意将“回归”中国运营
- 复兴号开进青藏铁路进入倒计时 有望7月1日运营
- 日本正式决定启动福岛核废水排海计划 韩国民众担心吃盐问题
- 员工因“饭量太大”被解雇要求赔偿 法院:驳回
- 【环球热闻】微信朋友圈转发扫码免费送米家风扇?小米辟谣:假的
- 比凯美瑞还便宜!特斯拉Model 3美国售价将低于20万 天天快看
- 报道:中国2023年汽车销量破1000万辆 出口量暴增 老外爱上国产车
- 前所未见:Win11神秘版本惊现Win10隐藏壁纸
- 环球信息:弦歌扬雅韵,诗乐绘情深,云外清音——大提琴与诗词音乐会举行
- EDG正式发布Uzi夏季赛定妆照!这就是瘦下来的神吗?
- 【天天时快讯】特斯拉辅助驾驶4年间在美国发生736起车祸 至少17人遇难
- 【报资讯】46.9℃!新疆又热到全国第一了
- 是个大工程!大熊猫洗澡两个半人摁半个负责洗:旁边一只在看戏-观天下
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
ArrayList 底层结构和源码分析 世界观天下
ArrayList 基本介绍
ArrayList
实现了List
接口。它可以存储包括null
的任何类型的对象,允许重复元素。ArrayList
在内部使用一个数组来存储元素,当元素数量超过数组容量时,ArrayList
会自动重新分配更大的内部数组,并且将现有元素复制到新数组中。ArrayList
基本等同于Vector
,但是ArrayList
是线程不安全的(执行效率高),在多线程情况下不建议使用ArrayList
。
ArrayList 源码阅读及操作机制
首先ArrayList
中用来存储元素的数组是 Object 类型的数组 elementData,ArrayList
的容量就是这个数组的大小。
(资料图片)
transient Object[] elementData;
通过 debug 下面这段代码来观察ArrayList
的扩容机制。
public class TestArrayList() { public static void main(String[] args) { ArrayList list = new ArrayList(); // ArrayList list = new ArrayList(4); for (int i = 1; i <= 10; i++) { list.add(i); } for (int i = 11; i <= 15; i++) { list.add(i); } }}
构造方法
当使用无参构造器创建ArrayList
对象时,会创建一个默认容量为10的空数组。
public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}
// 用于默认大小的空实例的共享空数组。将其与 EMPTY_ELEMENTDATA 区分开,// 以便在添加第一个元素时知道需要扩容多少。private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
使用指定大小的构造器创建ArrayList
对象时,则初始 elementData 容量为指定大小。
public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); }}
add(E e)
add(E e)
方法将指定元素添加到列表末尾,该方法先调用ensureCapacityInternal()
方法确保容量至少是所需的最小容量(即当前大小加一),然后再赋值。
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true;}
由于ArrayList
允许的元素类型是 Object,所以添加基本类型的数据时,会先将其转换为对应的包装类型。
ensureCapacityInternal(int minCapacity)
private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));}
calculateCapacity()
该方法计算需要的容量,如果elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
(使用无参构造器时即符合该条件),则返回DEFAULT_CAPACITY
(10),否则返回 minCapacity(size + 1)。
private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity;}
private static final int DEFAULT_CAPACITY = 10;
ensureExplicitCapacity(int minCapacity)
modCount 记录列表被结构性修改的次数(结构性修改是指添加或删除一个或多个元素,或显式调整后备数组的大小,仅仅设置元素的值不是结构性修改)。如果需要的容量大于 elementData 的长度,则调用grow()
方法进行扩容。
private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity);}
grow()
该方法增加容量以确保列表至少能够容纳最小容量参数minCapacity
指定的元素数量。计算得到新容量应为旧容量的 1.5 倍。如果计算得到的新容量小于需要的最小容量,则新容量应为需要的最小容量(使用无参构造器第一次添加元素时即为这种情况,第一次扩容为 10)。如果请求的数组大小超过了虚拟机的限制,可能会导致 OutOfMemoryError。最后通过数组复制copyOf.copyOf()
来进行真正的扩容。
private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = copyOf.copyOf(elementData, newCapacity);}
总结
当使用无参构造器创建ArrayList
对象时,elementData 初始容量为 0,第一次添加元素时 elementData 扩容为 10,以后再需要扩容,按 1.5 倍来扩容。若使用有参构造器创建ArrayList
对象,elementData 初始容量为指定大小,如果需要扩容,则扩容为 1.5 倍。
值得注意的是,由于每次调整容量都需要将所有元素复制到新数组中,所以在元素数量较多时,频繁地调整容量可能会导致性能下降。为了避免频繁地调整容量,可以使用ArrayList
的指定大小的构造方法或在添加大量元素之前使用ensureCapacity()
方法预先指定较大的容量,以减少容量调整的次数。
另外,当从ArrayList
中删除元素时,并不会立即缩小内部数组的容量。如果希望减少内存占用,可以使用trimToSize()
方法来调整ArrayList
的容量,使其与元素数量匹配。这样可以释放未使用的内存空间。
关键词:
-
保时捷发布其纯电概念hypercar 马力或将达到惊人的1500匹
就在刚刚,保时捷发布了一名为款Mission X的纯电概念hypercar。据悉,保时捷将会把全新的Mission X打...
来源: ArrayList 底层结构和源码分析 世界观天下
全球最大的红宝石拍卖价格高达2.48亿 创下有史以来最高纪录
保时捷发布其纯电概念hypercar 马力或将达到惊人的1500匹
伏罂而听的故事声音主要是借助于什么传入侦察兵的耳朵_伏罂而听的成语故事
福特回应称没有计划终止福特电马赫公司运营 或有意将“回归”中国运营
复兴号开进青藏铁路进入倒计时 有望7月1日运营
日本正式决定启动福岛核废水排海计划 韩国民众担心吃盐问题
员工因“饭量太大”被解雇要求赔偿 法院:驳回
【环球热闻】微信朋友圈转发扫码免费送米家风扇?小米辟谣:假的
比凯美瑞还便宜!特斯拉Model 3美国售价将低于20万 天天快看
报道:中国2023年汽车销量破1000万辆 出口量暴增 老外爱上国产车
前所未见:Win11神秘版本惊现Win10隐藏壁纸
“前端已死”甚嚣尘上,全栈工程师卷到起飞
磁盘分区
尚医通-day02【医院设置前端详细步骤】(内附源码)|环球快播报
全球热点评!记录--详解 XSS(跨站脚本攻击)
ESMap 三维地图在智慧园区三维场景的应用-数字孪生3D可视化服务平台 当前速递
环球信息:弦歌扬雅韵,诗乐绘情深,云外清音——大提琴与诗词音乐会举行
EDG正式发布Uzi夏季赛定妆照!这就是瘦下来的神吗?
【天天时快讯】特斯拉辅助驾驶4年间在美国发生736起车祸 至少17人遇难
【报资讯】46.9℃!新疆又热到全国第一了
是个大工程!大熊猫洗澡两个半人摁半个负责洗:旁边一只在看戏-观天下
环球今热点:马斯克脑机接口获批人体实验 公司估值高达50亿美元
美迪西:美熹企业通过大宗交易向其一致行动人王国林内部转让79.66万股
基于vue+flask+sql的公司销售采购信息服务系统|环球简讯
世界时讯:当GaussDB遇上了毕昇编译器
要闻:java 中锁的定义
.NET项目中使用HtmlSanitizer防止XSS攻击
外观酷似极氪001 阿维塔首款中大型轿跑E12实车谍照首曝
北方多地迎今年来最强高温!京津冀等11省份连续高温:局地40℃
神舟新款战神游戏本上架:酷睿i7+RTX 4060仅5898元_每日消息
理想销售称蔚来降价是为了活命 李斌:希望友商不要“带节奏”
视觉中国推出付费AI绘图功能:仅提供服务、无版权
V观财报|浙文影业第二大股东钱文龙短线交易致歉
优化3500倍,从70s到20ms的顶级调优,此方案人人可用
Ubuntu安装 Anaconda 3
全球今头条!2499元 铭凡Venus NPB5迷你主机上架:i5-13500H、双2.5G网口
全球资讯:真比加油快!宁德时代发布“骐骥换电”:重卡几分钟满血出发
性能逼近PS5!华硕首款掌机ROG Ally国行版已上架:6月14日开售
2399元 红魔电竞显示器2K银翼版开售:240Hz超高刷新率|新资讯
三星终于用上水滴铰链!Galaxy Z Fold5折痕缩小15%
当前动态:宋PLUS 冠军版6月19日上市 预售16.98万元起
世界看热讯:空间数据的智慧呈现:探秘GIS地图的魅力
社交app源码技术屏幕的两大实用功能
环球即时:科创板收盘播报:科创50指数震荡跌0.57% 汽车配件股大涨
ETF投资(十二) |ETF也可以融资融券吗? 世界看热讯
已四涨五跌 6月13日国内油价再次调整:这次或将搁浅
环球消息!解锁5G双卡的终极形态:边打游戏 边打电话
路上晒麦致电瓶车摔倒:因找不到主人 麦子被卖了1800元赔钱
球王也来直播带货?梅西6月14日淘宝开播:粉丝互动唯一机会
焦点热议:时隔6年新作终于公布!《极限竞速:Motorsport》定档10月
天天速递!解析汽车APP面临的18种攻击风险
告警:线上慎用 BigDecimal !-天天速递
我在大湾区推“茶”出“新”
瞬间卖爆!《星空》预购首日登顶Steam热销榜 头条焦点
网球明星的特斯拉被盗 结果小偷被“车载限速、定位”教育|环球时快讯
今日快看!毕业典礼比心时校长手指被强制“掰弯” 画面引网友发笑:够胆大
不容错过!霸王首乌/生姜洗发水狂促发车:券后19.9元一大瓶
耗时三年 丰田发布全新周边!首个可移动式豪华卫生间正式亮相
女子称撑破试穿裙子无奈买下 裙子一扯像纸就烂:网友热议为何要讹人
只坑有钱人!史玉柱称感谢网友表扬:中国最缺计算数学人才 曾给浙大捐五千万 |全球速讯
今亮点!《小美人鱼》全球票房突破4亿美元:黑美人鱼称要成为大家榜样、公主
全球速读:Java XML教程_编程入门自学教程_菜鸟教程-免费教程分享
自抽脸?日本突然声称核污水危害健康 曾高喊可饮用、ALPS成笑话
青岛通报“一桌饭菜收费三次”:错收3400元已退还
铭凡推出HN2673迷你主机:12代i7 首搭锐炫独显 全球新要闻
蔚来全系车型降3万!新车主“二选一”:可退3万块
泰安市财政局调研组到高新区调研财税工作
小米发布99元真无线耳机:单耳仅3.6g 28小时长续航
环球看点!似曾相识!麦芒A20官宣:5000万像素高清影像
大众CC超速迎头撞上大众途岳:后者A柱弯曲近乎报废_世界观速讯
【世界播资讯】还要啥自行车!2023款奇瑞艾瑞泽5 PLUS只要7.49万!快上车
北京修订电动自行车用锂电池标准:电池组超80℃ 车辆30秒内发声报警
探鱼的酱香味烤鱼,“酱”指的是什么酱呢?|环球精选
深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实体识别、实体、关系、属性抽取实战项目合集(含智能标注)_资讯推荐
环球今日报丨Qt 事件系统总结
Web网页端IM产品RainbowChat-Web的v5.0版已发布
【热闻】马斯克嘲讽人工智能:机器学习本质就是统计学
小学生用奶奶手机充值游戏2.9万 法院判决来了 世界视讯
“龙字辈”成员即将加入!长城发布全新硬派SUV 或命名:“翔龙”
河南雷暴大风 半米粗大树连根拔起 外卖小哥伸头躲过一劫
世界快播:蔚来宣布重大决定:免费换电权益解绑 全系车型降价3万
今日播报!村里种的“软黄金”迎来丰收季
每日速读!windows下如何杀掉Tomcat进程
焦点信息:5分钟学会数据结构中的线性链表
Python工具箱系列(三十五) 全球新消息
vue使用 elementUI中el-upload的遇到的问题总结
【新华解读】可转债退市机制逐步完善 未来或迎来“宽进宽出”市场生态_全球新动态
两批次食品不符合国家标准上黑榜 全球快资讯
俩石柱子被五菱一下子撞飞 附近店家感慨:此乃神车
米哈游去年赚了161亿!网友:够再开发十个《原神》了
每日快报!时代变了!未来18个月内 传奇瑞等大量国产车企将进入英国市场
世界速讯:越南因罕见高温遭遇“停电危机”:佳能等企业轮流停电
全球视讯!多种口味:和路雪经典大梦龙多口味雪糕16支88元发车
物联网开源操作系统简介 天天快资讯
Jenkins + Docker 一键自动化部署 Spring Boot 项目,步骤齐全,少走坑路! 全球微动态
甘肃省加快推进交通项目建设 每日快播
《暗黑4》第一件“军帽”在韩服现身 官方证实:最强欧皇诞生 属性无敌
苹果回应Mac Pro弃用AMD显卡:压根就不适配_天天微速讯
VIP体验卡到期!高考后饭菜的反差让人猝不及防:从“吃啥有啥”变“有啥吃啥”