ArrayList.add方法底层浅析
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方法底层浅析相关推荐
- Collection 属性ArrayList.add方法内部调用过程
Collection 属性 //二进制搜索阈值 private static final int BINARYSEARCH_THRESHOLD = 5000; //改变阈值 private stati ...
- java arraylist.add(),Java ArrayList add()方法与示例
ArrayList类add()方法 语法:public boolean add(T ele); public void add(int indices, T ele);add()方法在java.uti ...
- ArrayList add方法深度解析。
2019独角兽企业重金招聘Python工程师标准>>> ArrayList提供了四个方法添加元素,前两种添加一个元素,后两种为添加一Collection. 第一种我们前面已经见过并且 ...
- 回味集合(三)ArrayList的add方法
啥也不说了,直接撸源码: public class ArrayList<E> extends AbstractList<E>implements List<E>, ...
- Java ArrayList add()方法与示例
ArrayList类的add()方法 (ArrayList Class add() method) Syntax: 句法: public boolean add(T ele); public void ...
- ArrayList的add方法详解——让我们好好看看一个元素是如何插入到ArrayList集合当中(源码级别)
先看看源码的add方法都涉及到了那些主要方法 这是add方法 这是确保内部容量方法和判断是否扩容方法 这是扩容方法 一.没有手动设置集合大小 1) 确保内部容量< ensureC ...
- arrylist输入_创建一个ArrayList对象利用Add方法为其添加元素在文本框中输入数据在ArrayList查找?...
展开全部 如果是完全匹配的查找可以这样 public static void main(String[] args) { // TODO Auto-generated method stub Arra ...
- java的知识点23——泛型Generics、Collection接口、List特点和常用方法、 ArrayList特点和底层实现
泛型Generics 一般通过"容器"来容纳和管理数据.程序中的"容器"就是用来容纳和管理数据. 数组就是一种容器,可以在其中放置对象或基本类型数据. 数组的优 ...
- HashSet中的add()方法( 零 )(详尽版)
我们知道在使用HashSet集合时,也就是在用HashMap集合,这是因为HashSet的底层是HashMap, public HashSet() {map = new HashMap<> ...
最新文章
- Get Started with Service Metrics
- 报错整理:ImportError: cannot import name ‘mean_absolute_percentage_error‘ from ‘sklearn.metrics‘
- 物联网模式下的污水处理前景分析
- svn 切换账号信息
- [论文阅读] Looking for the Detail and Context Devils: High-Resolution Salient Object Detection
- c#利用反射+特性实现简单的实体映射数据库操作类(表与类的映射)
- wpf项目无法使用针式打印机_针式打印机更换色带芯
- swift中闭包的循环引用
- Linux无盘工作站
- ffmpeg 一条命令实现 圆形画中画效果
- saas平台 saas服务 什么是saas
- 洗衣机程序c语言代码大全,全自动洗衣机控制器设计的单片机代码
- matlab错误dparsfa,Dpabi安装出错,求助大大佬
- L2+ 概念要火!英伟达和英特尔都释放了什么信号?| CES 2019
- Windows10 2004五月更新正式版官方ISO纯净版镜像下载
- 锁定文件失败,打不开磁盘或它所依赖的某个快照磁盘
- Simulink嵌入式自动代码生成DSP 28335/28035/28x系列 (1)——官方例程(1)讲解 {ADC-PWM同步中断}
- ZB利用贴图生成纹理
- word 自带公式编辑器中公式等号对齐方法
- JAVA程序中怎么看线程的个数_一个文件中有10000个数,用Java实现一个多线程程序将这...