ArrayList add方法深度解析。
2019独角兽企业重金招聘Python工程师标准>>>
ArrayList提供了四个方法添加元素,前两种添加一个元素,后两种为添加一Collection。
第一种我们前面已经见过并且分析过。我们看一下下面的图解以及代码
public boolean add(E e) {//确保数组长度,不够则扩展ensureCapacityInternal(size + 1); //添加元素elementData[size++] = e;return true;}
第二种是在指定的位置添加一个元素。System.arraycopy(elementData, index, elementData, index + 1,
size - index);这方法很重要,list元素的添加很大程度上都依赖这个方法。第一个参数为要复制的源数组,第二个参数为要复制的开始位置,第三个是要复制的目的数组,第四个参数是复制到目的数组的开始位置,第五个参数为要复制的长度。
public void add(int index, E element) {//检查插入索引位置,超出范围,抛出异常,跟List长度作比较rangeCheckForAdd(index);//根据情况扩展数组长度,如果扩展数组长度,进行一次数组的复制ensureCapacityInternal(size + 1); //赋值新数组System.arraycopy(elementData, index, elementData, index + 1,size - index);//添加元素elementData[index] = element;//list长度加1size++;}private void rangeCheckForAdd(int index) {//如果索引大于List长度或者小于0,抛出异常if (index > size || index < 0)throw new IndexOutOfBoundsException(outOfBoundsMsg(index));}
第三个方法是添加一个集合
public boolean addAll(Collection<? extends E> c) {//转换为数组Object[] a = c.toArray();int numNew = a.length;//确保数组长度足够存储ensureCapacityInternal(size + numNew); //直接将转换后的数组从索引0开始复制//复制到elementData,从size开始复制//复制长度为a的长度,即集合长度System.arraycopy(a, 0, elementData, size, numNew);//list长度增加size += numNew;//如果要添加的集合长度为0,添加失败,即没添加return numNew != 0;}
第四个方法是在指定的位置添加一个集合,在指定的位置添加一个集合,则至少要对数组进行两次的复制,第一次移动元素,一遍有足够的空间添加集合,第二次才是添加集合,并且都是用System.arrayCopy()进行数组的处理。
public boolean addAll(int index, Collection<? extends E> c) {//也要检查索引是否越界rangeCheckForAdd(index);//转换为数组Object[] a = c.toArray();int numNew = a.length;//确保数组长度足够ensureCapacityInternal(size + numNew);//要移动的元素个数int numMoved = size - index;if (numMoved > 0)//移动元素System.arraycopy(elementData, index, elementData, index + numNew,numMoved);//添加集合System.arraycopy(a, 0, elementData, index, numNew);//长度增加size += numNew;return numNew != 0;}
后续我们自己实现一个自己的List。
转载于:https://my.oschina.net/jettyWang/blog/909877
ArrayList add方法深度解析。相关推荐
- Collection 属性ArrayList.add方法内部调用过程
Collection 属性 //二进制搜索阈值 private static final int BINARYSEARCH_THRESHOLD = 5000; //改变阈值 private stati ...
- ArrayList.add方法底层浅析
java ArrayList.add方法一共有两种方式,如下代码: ArrayList<Integer> arr = new ArrayList<>(); arr.add(1) ...
- java arraylist.add(),Java ArrayList add()方法与示例
ArrayList类add()方法 语法:public boolean add(T ele); public void add(int indices, T ele);add()方法在java.uti ...
- 指数平滑方法深度解析(一次二次三次)
简书同步参考链接 指数平滑方法说起来感觉挺简单的,不就是几期求均值吗,但是你知道在Eviews里做指数平滑模型的时候,1.他的初始值是如何确定的吗?2.初始值的确定方法可以按照我们想的去改变吗? 3. ...
- tf.reduce_sum()方法深度解析
首先看一下reduce_sum及其参数的注释 : def tf.reduce_sum(input_tensor, axis=None, keepdims=False, name=None) Compu ...
- python 静态方法_Python编程思想(25):方法深度解析
-----------支持作者请转发本文-----------李宁老师已经在「极客起源」 微信公众号推出<Python编程思想>电子书,囊括了Python的核心技术,以及Python的主要 ...
- 《数据结构》十道链表经典面试题多种方法深度解析
目录 ⛰️一.题目解析
- Java ArrayList add()方法与示例
ArrayList类的add()方法 (ArrayList Class add() method) Syntax: 句法: public boolean add(T ele); public void ...
- ArrayList的add方法详解——让我们好好看看一个元素是如何插入到ArrayList集合当中(源码级别)
先看看源码的add方法都涉及到了那些主要方法 这是add方法 这是确保内部容量方法和判断是否扩容方法 这是扩容方法 一.没有手动设置集合大小 1) 确保内部容量< ensureC ...
最新文章
- 【linux】Valgrind工具集详解(二):入门
- 零基础学oracle pdf_零基础怎么学手绘插画!
- Block 再学习 !
- 利用反射做类参数的校验
- android arm 寄存器,ARM汇编
- .NET实现之(自动更新
- 二项分布的采样或抽样(java实现)
- 运行Android Studio总是未发现设备
- UVALive - 3641 Leonardo's Notebook(polya计数)
- 一起看懂Redis两种持久化方式的原理
- 全网首发:warning: #warning “Using deprecated NumPy API, disable it by “ “#defining NPY_NO_DEPRECATED_API
- shell中返回值是1为真还是假_shell脚本返回值问题的解决
- 将CSDN文章下载为markdown文档
- 【数理统计】一题了解假设检验
- TensorFlow镜像安装(Anaconda)
- 中国建设银行信息技术类校招笔试心得
- mariaDB数据库安装
- 中国重型包装行业竞争趋势与发展规模分析报告2022-2028年版
- 服务器和客户端TSL协议不一致
- 在opencv使用发现轮廓函数时出现-vector subscript out of range的问题
热门文章
- 2038年问题 linux内核5.6,Linux Kernel 5.6 开发者已准备好应对 2038 年问题
- configure 查找依赖库_由浅入深:Python 中如何实现自动导入缺失的库?
- mybatis 三级缓存查询循序_MyBatis手把手跟我做系列(五) --- 一级缓存与二级缓存
- 交互进CMU后可以学计算机吗,转专业必看!申请计算机的先修课要求,以CMU为例...
- oracle20g,GaussDB 100 OLTP: 缩减创建数据库的20G空间需求及GS-00714
- 火狐浏览器允许ajax,ajax如何解决火狐浏览器或其它非ie浏览器的兼容性问题
- java 拷贝属性值_Java 反射拷贝相同的属性值到指定对象中(两种实现方式)
- CentOS6中连接ftp服务器下载文件时出现了java.net.SocketException: Connection reset
- php导入csv wps乱码,《excel打开csv格式乱码》 WPS不兼容EXCEL打开后出现乱码怎么解决...
- html左侧隐藏菜单栏,如何制作一个炫酷的隐藏侧边栏菜单