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方法深度解析。相关推荐

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

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

  2. ArrayList.add方法底层浅析

    java ArrayList.add方法一共有两种方式,如下代码: ArrayList<Integer> arr = new ArrayList<>(); arr.add(1) ...

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

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

  4. 指数平滑方法深度解析(一次二次三次)

    简书同步参考链接 指数平滑方法说起来感觉挺简单的,不就是几期求均值吗,但是你知道在Eviews里做指数平滑模型的时候,1.他的初始值是如何确定的吗?2.初始值的确定方法可以按照我们想的去改变吗? 3. ...

  5. tf.reduce_sum()方法深度解析

    首先看一下reduce_sum及其参数的注释 : def tf.reduce_sum(input_tensor, axis=None, keepdims=False, name=None) Compu ...

  6. python 静态方法_Python编程思想(25):方法深度解析

    -----------支持作者请转发本文-----------李宁老师已经在「极客起源」 微信公众号推出<Python编程思想>电子书,囊括了Python的核心技术,以及Python的主要 ...

  7. 《数据结构》十道链表经典面试题多种方法深度解析

    目录 ⛰️一.题目解析

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

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

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

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

最新文章

  1. 【linux】Valgrind工具集详解(二):入门
  2. 零基础学oracle pdf_零基础怎么学手绘插画!
  3. Block 再学习 !
  4. 利用反射做类参数的校验
  5. android arm 寄存器,ARM汇编
  6. .NET实现之(自动更新
  7. 二项分布的采样或抽样(java实现)
  8. 运行Android Studio总是未发现设备
  9. UVALive - 3641 Leonardo's Notebook(polya计数)
  10. 一起看懂Redis两种持久化方式的原理
  11. 全网首发:warning: #warning “Using deprecated NumPy API, disable it by “ “#defining NPY_NO_DEPRECATED_API
  12. shell中返回值是1为真还是假_shell脚本返回值问题的解决
  13. 将CSDN文章下载为markdown文档
  14. 【数理统计】一题了解假设检验
  15. TensorFlow镜像安装(Anaconda)
  16. 中国建设银行信息技术类校招笔试心得
  17. mariaDB数据库安装
  18. 中国重型包装行业竞争趋势与发展规模分析报告2022-2028年版
  19. 服务器和客户端TSL协议不一致
  20. 在opencv使用发现轮廓函数时出现-vector subscript out of range的问题

热门文章

  1. 2038年问题 linux内核5.6,Linux Kernel 5.6 开发者已准备好应对 2038 年问题
  2. configure 查找依赖库_由浅入深:Python 中如何实现自动导入缺失的库?
  3. mybatis 三级缓存查询循序_MyBatis手把手跟我做系列(五) --- 一级缓存与二级缓存
  4. 交互进CMU后可以学计算机吗,转专业必看!申请计算机的先修课要求,以CMU为例...
  5. oracle20g,GaussDB 100 OLTP: 缩减创建数据库的20G空间需求及GS-00714
  6. 火狐浏览器允许ajax,ajax如何解决火狐浏览器或其它非ie浏览器的兼容性问题
  7. java 拷贝属性值_Java 反射拷贝相同的属性值到指定对象中(两种实现方式)
  8. CentOS6中连接ftp服务器下载文件时出现了java.net.SocketException: Connection reset
  9. php导入csv wps乱码,《excel打开csv格式乱码》 WPS不兼容EXCEL打开后出现乱码怎么解决...
  10. html左侧隐藏菜单栏,如何制作一个炫酷的隐藏侧边栏菜单