ArrayLIst在指定位置插入的内部实现

今天看到一个问题:ArrayList的add方法有两种使用,那么add到指定位置内部是怎么实现的?

发现自己对这块地方不熟悉,所以立马去看了ArrayList下的源码

// 第一个
public boolean add(E var1) {
        this.ensureCapacityInternal(this.size + 1);
        this.elementData[this.size++] = var1;
        return true;
}

// 第二个
public void add(int var1, E var2) {
    // 判断插入位置是否在[0,size)内
    this.rangeCheckForAdd(var1);
    // 检查数组容量大小,不够则进行扩容(扩容因子为1.5)
    this.ensureCapacityInternal(this.size + 1);
    // native修饰方法,在JVM由c语言执行
    System.arraycopy(this.elementData, var1, this.elementData, var1 + 1, this.size - var1);
    // 在指定位置插入元素
    this.elementData[var1] = var2;
    // 记录数组元素个数
    ++this.size;
}

第一个 add方法没什么好说的,如果你对ArrayList有一定了解的话,它底层是使用一个动态数组实现的,其中 ensureCapacityInternal是检查数组容量大小,如果容量大小不够还会进行扩容操作,再将元素添加至末尾,并记录数组元素个数。

第二个 add方法主要分为五步:

  • rangeCheckForAdd该方法判断插入位置是否在[0,size]内(size指数组元素个数)
  • ensureCapacityInternal检查数组容量大小,不够扩容
  • System.arraycopySystem类下的方法,查看源码:
public static native void arraycopy(Object var0, int var1, Object var2, int var3, int var4);

可知 arraycopy使用 native关键字修饰,表示该方法是在在JVM由c语言执行的,它的作用通过查询jdk文档可知:

ArrayLIst在指定位置插入的内部实现
// 在ArrayList应用该方法实现效果

// elementData = [1,2,4,5,6,0,0,0,0,0]
// 参数列表(elementData, 2, elementData, 3, 3)
System.arraycopy(this.elementData, var1, this.elementData, var1 + 1, this.size - var1);
// elementData = [1,2,4,4,5,6,0,0,0,0]
  • 再在修改后的数组指定位置添加元素
  • 记录数组元素个数(++size)

Original: https://www.cnblogs.com/xnmk-zhan/p/16063514.html
Author: xnmk
Title: ArrayLIst在指定位置插入的内部实现

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/590679/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Question08-查询没学过”张三”老师授课的同学的信息

    * SELECT * FROM Student WHERE SID NOT IN ( SELECT DISTINCT Student.SID FROM Student , SC ,…

    数据库 2023年6月16日
    091
  • grafana+prometheus如何查看tcp连接数量

    最后解决方案 经过和负责监控的大佬了解,获得了一个可行的方案:在每个pod中新增一个sidecar容器,在容器中部署node_exporter,或者在容器中放个自动查看端口连接数并…

    数据库 2023年6月9日
    0122
  • Django配置日志功能

    Django配置日志功能 LOGGING = { ‘version’: 1, ‘disable_existing_loggers’: False, # 是否禁用已经存在的日志器 ‘…

    数据库 2023年6月14日
    099
  • 数组

    1. 数组概述 数组(array): 存储一个元素个数固定且元素类型相同的有序集 2. 数组的定义格式 格式一 数据类型[] 变量名 int[] array; –>推荐 格…

    数据库 2023年6月14日
    086
  • windows和乌班图使用固定的ip地址

    windows设置固定的ip地址:查看网上的方法很多人说修改无线网卡的配置:自动获取ip—-》使用下面的IP地址这样修改以后无法使用wifi上外网但是确实可以添加一个固…

    数据库 2023年6月11日
    0120
  • DevOps

    Docker: ## 安装Docker yum remove docker docker-client docker-client-latest docker-common doc…

    数据库 2023年6月9日
    073
  • 记一次stormOOM异常的产生与解决

    最近这段时间开始了一个新项目,项目使用rabbitMQ存储采集数据,通过storm对rabbitMQ中的数据进行实时计算,将结果存入到rabbitMQ的另一个队列中,再由另外一个s…

    数据库 2023年6月6日
    080
  • 牛客SQL刷题第一趴——非技术入门基础篇

    id device_id gender age university province 1 2138 male 21 北京大学 Beijing 2 3214 male 复旦大学 S…

    数据库 2023年5月24日
    0106
  • idea 自定义注释模板

    自定义的格式: html;gutter:true; * * * @Description * $param$ * @Author $user$ * @Date $time$ $da…

    数据库 2023年6月16日
    056
  • Django中后台语言设置的注意点

    2022-09-28 问题描述: 今天在设置Django项目后台语言设置的时候,出现了一个问题, 显示没有”zh-Hanz”语言,之前,输入语言设置的时候,…

    数据库 2023年6月14日
    077
  • Spring中常见的注解

    1.组件注解 @Controller @Service @Repository @Component —标注一个类为Spring容器的Bean @Configratio…

    数据库 2023年6月11日
    087
  • MySQL实战45讲 9

    09 | 普通索引和唯一索引,应该怎么选择? 每个人都有一个唯一的身份证号,而且业务代码已经保证了不会写入两个重复的身份证号。如果市民系统需要按照身份证号查姓名,就会执行类似这样的…

    数据库 2023年5月24日
    0110
  • Mybatis-Spring源码分析

    Mybatis-Spring 博主技术有限,本文难免有错误的地方,如果您发现了欢迎评论私信指出,谢谢JAVA技术交流群:737698533 当我们使用mybatis和spring整…

    数据库 2023年6月16日
    094
  • 计算字符串中指定字符最大连续出现的次数

    //连中次数public static int LzNum(String str) { // 分&#x5272…

    数据库 2023年6月11日
    094
  • mybatis-延迟加载

    本文主要介绍下mybatis的延迟加载,从原理上介绍下怎么使用、有什么好处能规避什么问题。延迟加载一般用于级联查询(级联查询可以将主表不能直接查询的数据使用自定义映射规则调用字表来…

    数据库 2023年6月16日
    072
  • chrome架构发展与提供的性能分析工具

    谷歌早期多进程架构分为插件进程(Plugin Process)、渲染进程(Render Process)、浏览器主进程(Browser Process) 插件进程负责插件的运行,通…

    数据库 2023年6月6日
    0323
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球