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.arraycopy是System类下的方法,查看源码:
public static native void arraycopy(Object var0, int var1, Object var2, int var3, int var4);
可知arraycopy使用native关键字修饰,表示该方法是在在JVM由c语言执行的,它的作用通过查询jdk文档可知:

// 在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)
ArrayLIst在指定位置插入的内部实现的更多相关文章
- 【转载】C#使用InsertRange方法往ArrayList集合指定位置插入另一个集合
在C#的编程开发中,ArrayList集合是一个常用的非泛型类集合,ArrayList集合可存储多种数据类型的对象.在实际的开发过程中,我们可以使用InsertRange方法在ArrayList集合指 ...
- PHP字符串指定位置插入字符串
1.substr_replace(string,replacement,start,length);需插入时设置length为0即可 string 必需.规定要检查的字符串. replacement ...
- 如何在JS数组特定索引处指定位置插入元素?
如何在JS数组特定索引处指定位置插入元素? 需求: 将一个元素插入到现有数组的特定索引处.听起来很容易和常见,但需要一点时间来研究它. // 原来的数组var array = ["one&q ...
- java格式化字符串,在指定位置插入指定字符串,兼容中英文以及特殊字符,例如:换行,用于解决生成pdf换行问题等问题
本博客是自己在学习和工作途中的积累与总结,仅供自己参考,也欢迎大家转载,转载时请注明出处. http://www.cnblogs.com/king-xg/p/6370890.html 如果觉得对您有 ...
- 【PHP】在目标字符串指定位置插入字符串
PHP如何在指定位置插入相关字符串,例子:123456789变为1_23_456789插入"_"到指定的位置! (可以用作换行或者其他处理) 插入示例,具体思路在代码中有注释: & ...
- Java分享笔记:RandomAccessFile流 & 在文件指定位置插入内容
RandomAccessFile流:随机存取文件流,该类定义了一个记录指针,通过移动指针可以访问文件的任意位置,且对文件既可以读也可以写.使用该类的write方法对文件写入时,实际上是一种覆盖效果,即 ...
- 利用RandomAccessFile类在指定文件指定位置插入内容
package File; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...
- Java 替换word文档文字,指定位置插入图片
先说下 需要的依赖包 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ex ...
- 在Word指定位置插入富文本域值(html文本)
遇到此问题,首先想到的就是各种百度.结果度娘了一会并没有发现有用的有效的解决方法,哎,看来还得靠自己啊. 首先整理了下手头上的资源,一是HtmlAgilityPack,专门解析Html文本用的:二是我 ...
随机推荐
- Dubbo telnet 命令能做什么?
dubbo 服务发布之后,我们可以利用 telnet 命令进行调试.管理. Dubbo2.0.5 以上版本服务提供端口支持 telnet 命令 连接服务 telnet localhost 20880 ...
- Container 在微服务中的用途是什么?
容器是管理基于微服务的应用程序以便单独开发和部署它们的好方法.您可以将 微服务封装在容器映像及其依赖项中,然后可以使用它来滚动按需实例的微服务, 而无需任何额外的工作.
- Redis缓存穿透、缓存雪崩、缓存击穿
缓存穿透: 缓存穿透,是指查询一个数据库一定不存在的数据.正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存.如果 ...
- 如何在Ubuntu 18.04 LTS上安装和配置MongoDB
MongoDB是一款非关系型数据库,提供高性能,高可用性和自动扩展企业数据库. MongoDB是一个非关系型数据库,因此您不能使用SQL(结构化查询语言)插入和检索数据,也不会将数据存储在MySQL或 ...
- Cloud Design Patterns & Architecture Styles
Cloud Design Patterns Categories Data Management Design and Implementation Messaging Patterns Ambass ...
- 在小程序Canvas中使用measureText
有时候我们在使用Canvas绘制一段文本时,会需要通过measureText()方法获取文本的宽度,例如: 创建canvas标签 <canvas id="canvas"> ...
- 三种div点击事件
<div id="div" onclick="alert('成功')">点击</div> var oDiv = document.get ...
- struts token令牌机制
利用Struts同步令牌(Token)机制来解决Web应用中的重复提交问题.该方法的基本原理是:服务器端在处理到达的request之前,会将request中的Token值与保存在当前用户session ...
- 爬虫---scrapy全站爬取
全站爬取1 基于管道的持久化存储 数据解析(爬虫类) 将解析的数据封装到item类型的对象中(爬虫类) 将item提交给管道, yield item(爬虫类) 在管道类的process_item中接手 ...
- python---if、while、for
if语句 当出现选择情况的时候,就需要用到if语句. # 第一种语法 if 条件: # 冒号将条件和结果分开,不可缺少 结果1 结果2 # 条件为真执行结果1,然后结果2:否则直接结果2 # 第二种语 ...