ArraList源码分析

网易 广州 梦幻西游端游 客户端社招笔试题 2024 4道算法题,时间2小时,牛客网笔试注:采用OJ模式,需要自己处理输入、输出。 阅读详情

ArraList源码分析

构造函数

ArrayList提供了多个重载构造函数,既可以指定初始容量也可以指定初始集合,或什么都不指定

无参构造函数

通过ArrayList()构造函数,可以构造一个空的ArrayList,使用DEFAULTCAPACITY_EMPTY_ELEMENTDATA空对象数组初始化属性elementData属性,此属性即用来存储我们add添加进来的元素

private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

添加元素

ArrayList提供多个添加元素的Api,既可以单个添加到末尾,又可以指定位置添加元素,也可以批量添加元素

添加单个元素到末尾

add(E e)提供添加单个元素到集合末尾的功能,其实现比较简单,一共分为两步

  • 检查数组容量是否充足,否则进行扩容

  • 向数组添加新元素

public boolean add(E e) {
    // 判断容量及扩容
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    // 添加元素
    elementData[size++] = e;
    return true;
}
ensureCapacityInternal容量判断与扩容解析
private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}

ensureCapacityInternal方法参数minCapacity为需要的最小集合容量,在add方法调用时会将size + 1,其中size即为当前集合元素个数即数组elementData的实际存储元素个数。在ensureCapacityInternal方法中先调用calculateCapacity(Object[] elementData, int minCapacity)方法计算需要的最小集合容量

private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}

calculateCapacity计算逻辑为如果当前元素集合为空,则取minCapacity与DEFAULT_CAPACITY(10)的较大值;如果不为空则直接返回minCapacity。当计算完集合所需容量之后ensureCapacityInternal方法继续调用ensureExplicitCapacity方法

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

在ensureExplicitCapacity方法中,首先将属性modCount加一,此属性表示列表结构更改次数。如果参数minCapacity大于目前已有元素列表大小,则执行grow方法传入minCapacity参数值

private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

在grow方法中,先判断minCapacity是否大于当前元素容量的1.5倍,如果大于,则按minCapacity进行扩容;如果小于,则按1.5倍容量扩容。但如果需要的容量大于MAX_ARRAY_SIZE(值为Integer.MAX_VALUE - 8),则会调用hugeCapacity方法重新计算容量

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 = Arrays.copyOf(elementData, newCapacity);
}

在hugeCapacity方法中,如果传入的需要扩展容量为负数,则抛出OutOfMemoryError异常。如果需要扩展容量大于MAX_ARRAY_SIZE则返回Integer.MAX_VALUE,否则返回MAX_ARRAY_SIZE

private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

至此添加单个元素的源码解析便结束

深入解析postcss-px-to-viewport-8-plugin:如何精准控制响应式转换范围 本文深入解析了postcss-px-to-viewport-8-plugin插件在响应式开发中的核心痛点——如何精准控制单位转换范围。针对插件默认全局转换的问题,文章提供了两种实战解决方案:通过编写巧妙的exclude正则表达式实现“曲线救国”,或直接修改插件源码补全include功能。同时,文章还分享了在Next.js、Vite等现代框架中的集成要点及常见问题排查方法,帮助开发者实现“外科手术式”的精准样式转换。 阅读详情

相关推荐

【STM32-DSP库的使用】基于Keil5 + STM32CubeMX + CMSIS-DSP 手动添加、库添加方式

CMSIS-DSP库在工程中应用遇到的所有问题进行归纳终结

洋洋的博客 1万+

Arralist源码分析

在看源码之前先看两个API: 1. int [] Arrays.copyOf(int[] original, int newLength) 2. System.arraycopy(Object src, int srcPos,Object dest, int destPos,int length); 两个代码功能相似.解析如下 Arrays.copyOf 申请newLength长度...

不会写代码的丝丽 435

一文读懂 AI 模型训练流程

AI模型训练流程可分为五个关键步骤:首先进行数据准备,包括收集、清洗、标注和增强数据;其次选择合适的模型架构并搭建神经网络;然后通过前向传播、损失计算和反向传播进行模型训练;接着用验证集评估模型性能,并调整超参数;最后在测试集上检验模型泛化能力。整个过程需要精心设计每个环节,才能获得性能优异的AI模型。

牧晨加油站 1486

ArraList扩容机制,源码分析

ArraList扩容机制,源码分析 当调用add()方法,首先调用扩容方法 public boolean add(E e) { // 新增容量 ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; } 下面进行扩容,扩容前要计算扩容多少calculateCapacity pri

weixin_45950398的博客 137

【教程4>第4章>第22节】FFT频偏估计方法,导频+cordic频偏估计方法,costas环的性能对比

频偏范围适应性:Costas 环频偏锁定和基于 PN 导频和 CORDIC 算法的频偏估计都可以通过调整参数来适应一定范围的频偏,但 Costas 环的频率捕获范围相对较窄,而基于 PN 导频和 CORDIC 算法的频偏估计,基于 FFT 变换频偏估计对频偏范围较大。在高信噪比条件下,三种方法都可以获得较高的估计精度,但在低信噪比环境中,基于 PN 导频和 CORDIC 算法的频偏估计,基于 FFT 变换频偏估计这两个开环方案相对更具优势,而Costas 环频偏锁定的精度可能会受到较大影响.

FPGA/MATLAB学习教程/源码/项目合作开发 611

C#WPF常用的9种布局方式详解

本文介绍WPF中常用的九种布局,Grid、StackPanel、WrapPanel、DockPanel、UniformGrid、Canvas、ScrollViewer、ViewBox、Border。

qq_30725967的博客 1万+

面试必会之ArrayList源码分析&手写ArrayList

注:本文所有方法和示例基于jdk1.8 简介 ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于对元素进行查找,效率非常高。 线程安全性 对ArrayList的操作一般分为两个步骤,改变位置(size)和操作元素(e)。所以这个过程在多线程的环境下是不能保证具有原子性的,因此A...

Java笔记虾 1356

[SaaS] 阿里妈妈-万相营造

有controlnet的介入,我们是默认controlnet会介入,在inapinting时会把带有商品的画布做一点扩充,然后走inapinting和controlnet,其实也做了一点outpainting的工作。基于阿里妈妈营销平台,提供从图文到视频再到落地页的素材级智能化创意支持,是您营销创意数字资产累积和升值的阵地,最大化提升营销的效率和效果。目前看来抠图基本都是sam了,现在weshop也是,都有一个预扣好的主体,但是一点进去也会重新sam。atomovideo->图生视频。

liguandong 524

List中的ArrayList和LinkedList源码分析

List是在面试中经常会问的一点,在我们面试中知道的仅仅是List是单列集合Collection下的一个实现类, List的实现接口又有几个,一个是ArrayList,还有一个是LinkedList,还有Vector。这次我们就来看看这三个类的源码。 ArrayList ArrayList是我们在开发中最常用的数据存储容器,它的底层是通过数组来实现的。我们在集合里面可以存储任何类型的数据, 而且...

懿的博客 1566

点云体积计算方法之一 附python代码

另外需要注意,这个只适合点云密集分布的场景来计算体积,比如树木扫描的体积;如果只是有表面积扫描的点云,该方法就不能计算整个物体的体积了。通过计算点云所占用的体素的数量来计算点云的近似体积。这是一个非常粗略的近似值,对于复杂的形状可能不准确。

三维点云技术探索 1888

30、电力生产系统中的效率测量

本文探讨了如何使用数据包络分析(DEA)模型来评估电力生产系统的效率。文章详细介绍了电力生产系统的三个主要环节——发电、输电和配电,并通过多种DEA模型,如输入导向模型、输出导向模型以及基于松弛的SBM模型,展示了效率测量的方法和技术。同时,结合实际案例分析,说明了DEA模型在识别效率低下环节及提出改进建议方面的应用价值。

rgv2345678的博客 117

arraylist最大长度_ArrayList源码分析基于JDK1.8(下)

一、源码总结在源码类的注释中提到ArrayList用可伸缩数组实现的这个List接口,继承自AbstractList,AbstractList 实现了List接口,提供了List接口的默认实现。ArrayList自身也实现了List接口,实现了对集合的CURD的操作,实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标进行快速访问,RandomAccess是一个标记接...

weixin_39799646的博客 96

游戏大厂状态同步与帧同步技术全解析——让虚拟世界万物协同的“时间齿轮”

本文深入解析了大厂游戏开发中的两种核心同步技术:状态同步和帧同步。状态同步适合大型MMO和FPS游戏,由服务端计算并广播世界状态;帧同步则通过统一操作输入实现MOBA和RTS游戏的绝对公平。文章详细比较了两者的差异、适用场景和底层实现原理,并揭秘了《王者荣耀》《PUBG》等热门游戏的同步机制。同时探讨了本地预测、延迟补偿、防作弊等关键技术,以及未来AI和云游戏带来的同步新挑战,为开发者提供了全面的技术参考和实践指南。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 923

ArrayList底层原理源码分析(转)

ArrayList简介 ArrayList是我们在开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据。ArrayList又是线程不安全的,这在接下来代码分析的过程中会有体现。ArrayList非常适合对元素进行查找,效率非常高。 源码分析 既然是分析源码,那我们先从构造函数开始。我们常用的构造函数有两个...

hongjingtianw的专栏 455

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ArrayList源码分析(着重迭代器安全删除)

ArrayList是我们最常用的集合类型之一,大家都知道他的底层实现是数组。最近刚好想研究一下jdk的源码,就从ArrayList开始看吧。 本来我想写的 但是我看完源码在查资料的时候发现 这个老哥写的很好,跟我的想法很像,下面贴出链接 https://blog.youkuaiyun.com/starexplode/article/details/80469079 他有些地方没写全 我这里补充一下 比如迭代器...

一只猪啊啊的博客 593

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java源码之ArrayList分析

一、ArrayList简介 ArrayList底层的数据结构是数组,数组元素类型为Object类型,即可以存放所有类型数据。 与Java中的数组相比,它的容量能动态增长。当创建一个数组的时候,就必须确定它的大小,系统会在内存中开辟一块连续的空间,用来保存数组,因此数组容量固定且无法动态改变。ArrayList在保留数组可以快速查找的优势的基础上,弥补了数组在创建后,要往数组添加元素的弊端...

225

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ArrayList什么情况会抛出ConcurrentModificationException

背景 近日,在看ArrayList的源码实现,发现很多情况会抛出ConcurrentModificationException。下面总结一下大致发生的情况。 首先,ArrayList不是线程安全的。 首先来看一个例子: public static void main(String[] args){ List<Integer> aList = new ArrayList<Integer>(); aList.add(1); aList.

ruanyandong的博客 811

源码分析(二)——ArrayList(基于JDK1.6)

一、ArrayList的定义: public class ArrayList&lt;E&gt;            extends AbstractList&lt;E&gt;              implements List&lt;E&gt;, RandomAccess, Cloneable, java.io.Serializable 从上述定义可以看出: 1. Arra...

iteye_7682的博客 163

Java基础面试题(18)----ArrayList集合源码解析

我们对ArrayList集合的源码进行解析,只是写出了增删改查的方法。 首先我们来看一下ArrayList的数据结构 底层实际上是一个数组,在增加元素的时候,对数组进行扩容,添加一个元素,容量增加1。 实际存储的是顺序存储的结构,每个位置的元素都有执行的索引,所以可以实现快速的查找元素。 用简单的图片展示,如下: 但是当在指定位置添加元素的时候,后面位置的元素统一向后移动,效率较低,这里会调...

weixin_42229056的博客 1727

ArrayList,LinkedList和Vector三者的异同

java学习笔记 相同:三个类都实现了List接口,存储数据的特点相同,存储有序的,可重复的数据 不同: ArrayList:作为List接口的主要实现类;线程不安全,效率高,底层使用Object[] elementData存储 LinkedList:对于频繁的插入、删除操作,使用此类效率比ArrayList高;底层使用双向链表存储 Vector:作为List接口的古老实现类线程安全的,效率低;底层使用Object[] elementData存储 ArrayList源码分析 jdk1.7和jdk1.8稍有不

weixin_42371679的博客 221

ArrayList-数组集合

ArrayList底层由数组实现,数组在java内存是连续片段,所以数组增删某元素时,删除元素后,需要将整个片段前移填补空缺,运行速度比较慢。 ArrayList,LinkedList相对区别 ArrayList:查询快,增删慢。 LinkedList:查询慢, 增删快。(只需要改变前后元素的指向) public class ArrayList<E> extends Abst

csdn_ygy的博客 607

Java集合——ArrayList源码解析

一 前言 最近去2家大厂面试被虐了,被虐也在意料之中,自己也没有怎么准备,决定回来好好学习,注重细节,多读源码,切勿眼高手低。给我最大感觉是大厂特别重视基础知识,对这些基础知识的深入理解,我们平时做项目的时候,都是会用一些容器,控件,框架,对源码有点了解,但是没有深入解读,半懂不懂,这样在面试官对知识点的层层深入时,就力不从心,结局你懂得,所以我们还是要多注重细节,多读源码。 不说那么多了,我...

zhangqiluGrubby的博客 882

ArrayList 线程安全问题

前言 在观看多线程书籍的时候,经常会看到大家提及ArrayList与HashMap时候.皆会说明, ArrayList与HashMap类型都不是线程安全的. 那么,在传统的集合包内的集合类到底为什么线程非安全呢?在新的JUC包类又有什么可以替代呢? 让我们开始今天的部分. 本章主要包括如下几个部分: 为什么ArrayList是线程非安全的? 替代措施(Vector类 / Colletions封装...

Be yourself. 3万+

ArrayList和HashMap源码解毒

待

CW_SZDX的博客 425

Java重要类详解之ArrayList类

一.ArrayList概述 ArrayList 是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess[随机访问], Cloneable[可克隆], java.io.Serializable[序列化]这些接口。ArrayList 继承了AbstractList,实现了List。它是

生命奇迹泉的专栏 5241

ArrayList for遍历删除分析

一、案例 //案例一 public static void main(String[] args) { List&lt;String&gt; list = new ArrayList&lt;&gt;(); list.add("1"); list.add("2"); for (String item : list) { ...

NCS123456的博客 272
上一篇: B树及应用
下一篇: SkyWalking源码编译及构建本地开发环境
炒栗子不加糖
博客等级 码龄10年 68粉丝 123原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值