首页 > 编程语言 > ArrayList源码

ArrayList源码

时间:2023-08-01 12:44:34浏览次数:47  
标签:容量 int ArrayList elementData newCapacity minCapacity 源码

add方法

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

// 添加元素
public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // 确保数组容量足够添加
    elementData[size++] = e;
    return true;
}

调用add方法往ArrayList中添加元素时,整体分为两个步骤:1、确保有足够的容量;2、把元素添加进去;所以这里的重点就是第一步了。

// 确认内置容量
private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
// 计算容量
private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
}

ensureCapacityInternal方法又分为两步,1、计算容量;2、确保容量足够;

calculateCapacity计算容量,如果是调用了ArrayList的无参构造方法的话,使用的就是DEFAULTCAPACITY_EMPTY_ELEMENTDATA,所以就会拿默认容量DEFAULT_CAPACITY和传进来的minCapacity进行比较,选择较大值作为新容量。

如果创建ArrayList时传入了容量,那么这里就是数组容量加1了。

// 确保显示容量
private void ensureExplicitCapacity(int minCapacity) {
    modCount++;

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

ensureExplicitCapacity方法中首先执行了一个modCount++,这个的目的是防止并发修改,数组容量每次发生修改都要修改这个值,然后和expectedModCount进行比较,如果不一致就会触发异常。

先判断一下数组现在的容量是否小于需要的容量,如果是的会就需要扩容了,否则容量足够就不用执行操作,直接把数据存进去就行了。

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;  // 获取现在的容量
    int newCapacity = oldCapacity + (oldCapacity >> 1);  // 扩容 变为1.5倍
    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);
}
private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // overflow
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

标签:容量,int,ArrayList,elementData,newCapacity,minCapacity,源码
From: https://www.cnblogs.com/bright1st/p/17596150.html

相关文章

  • HashMap源码
    put方法finalVputVal(inthash,Kkey,Vvalue,booleanonlyIfAbsent,booleanevict){Node<K,V>[]tab;Node<K,V>p;intn,i;//这个p是开始定位到的Node或者TreeNodeif((tab=table)==null||(n=tab.length)==0)//如果数组是n......
  • 智慧校园源码:vue2+Java+springboot+MySQL+elmentui+jpa+jwt
    智慧校园综合管理云平台源码系统主要以校园安全、智慧校园综合管理云平台为核心,以智慧班牌为学生智慧之窗,以移动管理平台、家校沟通为辅。教师—家长一学校—学生循环的无纸化管理模式及教学服务,实现多领域的信息互联互通以及校园管理一体化、信息数据化、数据自动化。智慧班牌融合......
  • 国标GB28181视频平台LntonGBS(源码版)国标平台迁移服务器后无法启动的问题解决方案
    国标视频云服务LntonGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格......
  • 推荐魔娃西游源码
     演示地址:runruncode.com/shouyou/19503.html手游魔娃西游是一款受欢迎的手机游戏。这款游戏以中国古代神话故事《西游记》为背景,玩家可以扮演主角孙悟空,与其他角色一起展开冒险旅程。在游戏中,玩家将面临各种挑战和任务。他们需要完成各种任务,如打败恶魔、解救被困的角色以......
  • RocketMq消费原理及源码解析
    消费原理概览 先简单说下常见的rocketMq的部署方式,上图中broker为真正计算和存储消息的地方,而nameServer负责维护broker地 图中右侧consumemessage部分即是本文重点描述的部分,主要分为ConsumerGroup和Consumer,consumerGroup可以参考https://rocketmq.apache.org/docs/do......
  • php随机图片源码
    <?php//设置图片文件夹路径$dir='images/';//获取文件夹中所有图片文件名$files=glob($dir.'*.{jpg,jpeg,png,gif}',GLOB_BRACE);//随机选择一张图片$random_file=$files[array_rand($files)];//设置响应头为图片类型header('Content-Type:image/jpeg');//输出......
  • 从源码解读Mysql 5.7性能和数据安全性的提升
    下面我们从源码来分析mysql的事务提交以及事务在何时将binlog复制到从库的。MYSQL_BIN_LOG::ordered_commit,这个是事务在binlog阶段提交的核心函数,通过该函数,实现了事务日志写入binlog文件,以及触发dump线程将binlog发送到slave,在最后的步骤,将事务设置为提交状态。我们来分析MYSQL_B......
  • Nacos源码 (1) 源码编译及idea环境
    本文介绍从gitee下载nacos源码,在本地编译,并导入idea进行本地调试。从gitee下载源码由于github访问速度慢,所以我选择使用gitee的镜像仓库:gitclonehttps://gitee.com/mirrors/Nacos.git本文使用2.0.2版本,所以需要切换到2.0.2分支:cdNacosgitcheckout2.0.2创建一个自己......
  • 某交易平台客服系统源码搭建部署
    近期我公司与宁德鸿凯网络科技有限公司达成合作,为其产品鸿凯交易平台等搭建客服系统,提供全源码客服系统搭建部署。项目需求客户公司的客服比较多,有四五十个,需求是能够将客服系统用于公司多部门下的用户咨询接待,多部门的客服坐席智能自动分配接待,并且能互相转接用户等。后期,需......
  • 视频直播网站源码,随机密码生成器
    视频直播网站源码,随机密码生成器方法调用 publicstaticvoidmain(String[]args){    //排除字符0OoB81lI,包含大写字母,包含小写字母,包含数字,包含特殊字符,长度8,生成10000个,特殊字符集    generatePassword("0OoB81lI",true,true,true,true,8,10000,"~!@^*%......