java ArrayList.add方法一共有两种方式,如下代码:

ArrayList<Integer> arr = new ArrayList<>();
arr.add(1);//第一种,顺序在末尾添加元素
arr.add(0,2);//第二种,在指定位置添加元素
System.out.println(arr);

第一种是添加在末尾,第二种是添加在指定位置

我们分别来看下这两种方法底层是怎么实现的


第一种:

public boolean add(E e) {ensureCapacityInternal(size + 1);  // Increments modCount!!elementData[size++] = e;return true;
}

第一种方式十分的简单,先用ensureCapacityInternal()方法增加list长度实现,然后把新的元素放到末尾


第二种:

public void add(int index, E element) {rangeCheckForAdd(index);//检查index合法性ensureCapacityInternal(size + 1);  // Increments modCount!!System.arraycopy(elementData, index, elementData, index + 1,size - index);elementData[index] = element;size++;
}

第二种方式先用rangeCheckForAdd()方法查看的index的合法性,大于list.size的和小于0,则会报错数组越界,代码如下

private void rangeCheckForAdd(int index) {if (index > size || index < 0)throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

判断完index的合法性之后,然后用ensureCapacityInternal()方法扩容

之后使用System.arraycopy()方法对list进行操作

public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)

src:源数组(被操作的数组);

srcPos:源数组要复制的起始位置(从源数组的什么位置开始复制);

dest:目的数组(要复制到的那个数组);

destPos:目的数组放置的起始位置(从哪个元素开始覆盖);

length:复制的长度(复制多少位);

//例:
//数组1:
int[] arr1 = { 1, 2, 3, 4, 5 };
//数组2:
int[] arr2 = { 6, 7, 8, 9, 10 };
//运行:
System.arraycopy(arr, 1, arr2, 0, 2);

意思就是复制arr1的下标1位置开始往后的两个元素[2, 3],然后替换arr2中的下标0位置开始,往后的两个元素[6, 7],最后运行的的结果是:{2,3,8,9,10}

这个方法同样可以实现自己到自己的拷贝,也就是ArrayList.add往中间插入的方法用到的用法

//例:
//数组: //ArrayList.add方法中先用ensureCapacityInternal进行了扩容,使得末尾空出一个null
object[] arr = { 1, 2, 3, 4, 5 ,6 ,7 ,8 ,null};
System.arraycopy(arr, 1, arr, 2, 7);
//这段代码的执行的结果为:{ 1,null, 2, 3, 4, 5 ,6 ,7 ,8};

这时候我们再来看下ArrayList.add方法,就十分的清晰了

public void add(int index, E element) {rangeCheckForAdd(index);//检查index合法性ensureCapacityInternal(size + 1);  // 扩容System.arraycopy(elementData, index, elementData, index + 1,size - index);//把index位置空出来,给插入的元素留位置,后边的元素向后顺延一个elementData[index] = element;//在空位添加元素size++;
}

ArrayList.add方法底层浅析相关推荐

  1. Collection 属性ArrayList.add方法内部调用过程

    Collection 属性 //二进制搜索阈值 private static final int BINARYSEARCH_THRESHOLD = 5000; //改变阈值 private stati ...

  2. java arraylist.add(),Java ArrayList add()方法与示例

    ArrayList类add()方法 语法:public boolean add(T ele); public void add(int indices, T ele);add()方法在java.uti ...

  3. ArrayList add方法深度解析。

    2019独角兽企业重金招聘Python工程师标准>>> ArrayList提供了四个方法添加元素,前两种添加一个元素,后两种为添加一Collection. 第一种我们前面已经见过并且 ...

  4. 回味集合(三)ArrayList的add方法

    啥也不说了,直接撸源码: public class ArrayList<E> extends AbstractList<E>implements List<E>, ...

  5. Java ArrayList add()方法与示例

    ArrayList类的add()方法 (ArrayList Class add() method) Syntax: 句法: public boolean add(T ele); public void ...

  6. ArrayList的add方法详解——让我们好好看看一个元素是如何插入到ArrayList集合当中(源码级别)

    先看看源码的add方法都涉及到了那些主要方法         这是add方法 这是确保内部容量方法和判断是否扩容方法 这是扩容方法 一.没有手动设置集合大小 1) 确保内部容量< ensureC ...

  7. arrylist输入_创建一个ArrayList对象利用Add方法为其添加元素在文本框中输入数据在ArrayList查找?...

    展开全部 如果是完全匹配的查找可以这样 public static void main(String[] args) { // TODO Auto-generated method stub Arra ...

  8. java的知识点23——泛型Generics、Collection接口、List特点和常用方法、 ArrayList特点和底层实现

    泛型Generics 一般通过"容器"来容纳和管理数据.程序中的"容器"就是用来容纳和管理数据. 数组就是一种容器,可以在其中放置对象或基本类型数据. 数组的优 ...

  9. HashSet中的add()方法( 零 )(详尽版)

    我们知道在使用HashSet集合时,也就是在用HashMap集合,这是因为HashSet的底层是HashMap, public HashSet() {map = new HashMap<> ...

最新文章

  1. Get Started with Service Metrics
  2. 报错整理:ImportError: cannot import name ‘mean_absolute_percentage_error‘ from ‘sklearn.metrics‘
  3. 物联网模式下的污水处理前景分析
  4. svn 切换账号信息
  5. [论文阅读] Looking for the Detail and Context Devils: High-Resolution Salient Object Detection
  6. c#利用反射+特性实现简单的实体映射数据库操作类(表与类的映射)
  7. wpf项目无法使用针式打印机_针式打印机更换色带芯
  8. swift中闭包的循环引用
  9. Linux无盘工作站
  10. ffmpeg 一条命令实现 圆形画中画效果
  11. saas平台 saas服务 什么是saas
  12. 洗衣机程序c语言代码大全,全自动洗衣机控制器设计的单片机代码
  13. matlab错误dparsfa,Dpabi安装出错,求助大大佬
  14. L2+ 概念要火!英伟达和英特尔都释放了什么信号?| CES 2019
  15. Windows10 2004五月更新正式版官方ISO纯净版镜像下载
  16. 锁定文件失败,打不开磁盘或它所依赖的某个快照磁盘
  17. Simulink嵌入式自动代码生成DSP 28335/28035/28x系列 (1)——官方例程(1)讲解 {ADC-PWM同步中断}
  18. ZB利用贴图生成纹理
  19. word 自带公式编辑器中公式等号对齐方法
  20. JAVA程序中怎么看线程的个数_一个文件中有10000个数,用Java实现一个多线程程序将这...

热门文章

  1. Element_Table的单元格合并
  2. C语言 | 复制字符串 不用strcpy
  3. 彻底搞懂ResNet50
  4. element-ui的走马灯详解
  5. PyTorch中 nn.Conv2d与nn.ConvTranspose2d函数的用法
  6. 【CentOS】常用命令
  7. superset设置起止时间为明天
  8. 低轨卫星传播特性仿真与分析
  9. cfd计算机辅助技术,CFD仿真在生物医学领域拯救生命
  10. 资深书虫测评2018年最热网络小说App~看书必备