先看看源码的add方法都涉及到了那些主要方法

        这是add方法

这是确保内部容量方法和判断是否扩容方法

这是扩容方法

一、没有手动设置集合大小

1) 确保内部容量< ensureCapacityInternal(size + 1) >;
2) 判断数组是否为未初始化状态< if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) > ;
3) 如果是则进行初始化,并且选择(默认数组大小10,或者用户设置的大小)中取最大作为数组长度 < minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);  > ;
4) 如果数组已经初始化数组,执行下一步判断是否需要扩容 < ensureExplicitCapacity(minCapacity) > ;
5) 判断数组是否需要扩容<  if (minCapacity - elementData.length > 0) grow(minCapacity) >;
6) 如果需要扩容, 就按当前数组大小加上它的一半作为扩容之后的数组长度<  int newCapacity = oldCapacity + (oldCapacity >> 1) >, 进行下一步操作;
7) 如果不需要扩容,进行下一步操作;
8) 将元素插入到数组的尾部<  elementData[size++] = e >

二、有手动设置集合大小

1)确保内部容量< ensureCapacityInternal(size + 1) >;
2)判断数组是否为未初始化状态< if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) > ;
3)因为已经指定数组大小(也就是说已经初始化数组) 判断之后直接执行下一步 判断不否扩容< ensureExplicitCapacity(minCapacity) > ;
4)判断数组是否需要扩容<  if (minCapacity - elementData.length > 0) grow(minCapacity) >;
5)如果需要扩容, 就按当前数组大小加上它的一半作为扩容之后的数组长度<  int newCapacity = oldCapacity + (oldCapacity >> 1) >, 进行下一步操作;
6)如果不需要扩容,进行下一步操作;
7)将元素插入到数组的尾部<  elementData[size++] = e >

 ****别急这还有重点****

问: ArrayList(int initialCapacity)会不会初始化数组大小?

答: 会初始化数组大小!但是List的大小没有变,因为list的大小是返回size的。

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

  1. 详解5种红黑树的场景,从Linux内核谈到Nginx源码,听完醍醐灌顶丨Linux服务器开发丨Linux后端开发

    5种红黑树的场景,从Linux内核谈到Nginx源码,听完醍醐灌顶 1. 进程调度CFS的红黑树场景 2. 虚拟内存管理的红黑树场景 3. 共享内存slab的红黑树场景 视频讲解如下,点击观看: [干 ...

  2. 手写代码详解Android Hook入门demo,android应用案例开发大全第四版源码

    2. 实用价值 3. 前置技能 4. hook通用思路 5. 案例实战 6. 效果展示 正文 == 1. hook的定义 hook,钩子.勾住系统的程序逻辑. 在某段SDK源码逻辑执行的过程中,通过代 ...

  3. Silverlight实用窍门系列:54.详解Silverlight中的矩阵变换MatrixTransform,实现其余各种变换【附带实例源码】...

    在Silverlight中的MatrixTransform矩阵变换相对上篇文章所述的变换较复杂一些,但这种变换也更灵活. MatrixTransform的实质:让需要变换的元素上的每一个像素点*矩阵得 ...

  4. ADI Blackfin DSP处理器-BF533的开发详解58:DSP控制ADXL345三轴加速度传感器的应用(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 MEMS三轴加速度传感器 我做了一个三轴加速度 ...

  5. ADI Blackfin DSP处理器-BF533的开发详解22:SD卡的设计和实现原理及应用(含源码)

    硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP++软件 硬件链接 硬件设计原理图 功能介绍 ADSP-EDU-B ...

  6. split()方法详解

    split()方法详解 1.split()主要是用于对一个字符串进行分割成多个字符串数组.标准形式为String [] strings = str.split(""); 2.spl ...

  7. Spring JdbcTemplate方法详解

    2019独角兽企业重金招聘Python工程师标准>>> Spring JdbcTemplate方法详解 标签: springhsqldbjava存储数据库相关sql 2012-07- ...

  8. java构造和解析json_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  9. java json解析 代码_Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

最新文章

  1. 刚进来的小伙伴说Nginx只能做负载均衡,还是太年轻了
  2. 创建一个纯色的背景图
  3. 7-68 阶乘计算 (15 分)
  4. [翻译]DirectX 状态( 转)
  5. 课后作业-阅读任务-阅读笔记4
  6. Java 时间戳转换成时间
  7. 第4课 列朋波骨《小学生C++趣味编程》
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的甜品店商城
  9. vue项目实现记住密码功能
  10. SVG 动画(animate、animateTransform、animateMotion)
  11. 二极管整流和同步整流区别
  12. html5 webp,在 CRA 中使用 webp 图片提升加载性能
  13. promise执行顺序总结
  14. 董卫凤:不服输的华丽转身(一)
  15. 实验一 利用Excel表格进行掷硬币模拟实验
  16. jcr多久更新一次_JCR-2017更新 | 快来看看你的影响影子吧
  17. 第二十五章 Unity 刚体Rigidbody
  18. 关卡一: jQuery编程
  19. 硬件部分第三次培训——LCD1602、串口中断、SPI
  20. # 2021-01-17 #「File Browser」- 基于网页的文件管理器

热门文章

  1. C++ 函数指针 指向类成员函数
  2. 免费体验,快速对接身份证实名认证API接口说明
  3. RF-SIM卡的多应用COS研究与设计
  4. 4.6 案例10 使用QList处理数据集
  5. GIF图片如何用Photoshop去水印?
  6. SNIPER python3.5环境配置成功记录
  7. 基于Linux下的VIC使用(1)VIC部分(Fortran版本)
  8. Elasticsearch 新增字段
  9. Muli3D源码分析(1) - 框架概览
  10. Attach、Detach和DeleteObject