初始化数组长度为空时, 懒加载

add方法

初始无参构造器

第一次添加
public boolean add(E e) {
   // 确定容量 动态扩容 size 初始 0
   ensureCapacityInternal(size + 1);  // Increments modCount!!
   // 将要添加的元素 添加到数组中 elementData[0] = 1 --> size = 1
   elementData[size++] = e;
   return true;
}
private void ensureCapacityInternal(int minCapacity) {
       // ensureExplicitCapacity(10)
       ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
/**
* elementData {}
 minCapacity 1
*/
private static int calculateCapacity(Object[] elementData, int minCapacity) {
   if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
       // 10 1 return 10
       return Math.max(DEFAULT_CAPACITY, minCapacity);
  }
   // 5
   return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {
   modCount++; // 增长 操作次数

   // minCapacity 10
   if (minCapacity - elementData.length > 0)
       grow(minCapacity);
}
private void grow(int minCapacity) { // 10
   // overflow-conscious code
   int oldCapacity = elementData.length; // 0
   // newCapacity = 0
   int newCapacity = oldCapacity + (oldCapacity >> 1);
   if (newCapacity - minCapacity < 0)
       // newCapacity = 10
       newCapacity = minCapacity;
   if (newCapacity - MAX_ARRAY_SIZE > 0)
       newCapacity = hugeCapacity(minCapacity);
   // {}   {,,,,,,,,,} 返回一个新的数组 长度为10
   elementData = Arrays.copyOf(elementData, newCapacity);
}
第二次添加
elementData = {1,,,,,,,,,};
size = 1;
public boolean add(E e) {
   // 2
   ensureCapacityInternal(size + 1);  // Increments modCount!!
   elementData[size++] = e; // elementData[1] = 2 size = 2
   return true;
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {
   if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
       return Math.max(DEFAULT_CAPACITY, minCapacity);
  }
   // 2
   return minCapacity;
}
private void ensureExplicitCapacity(int minCapacity) {
   modCount++;

   // overflow-conscious code 2 - 10
   if (minCapacity - elementData.length > 0)
       grow(minCapacity);
}
第十一次添加
elementData = {1,2,3,4,5,6,7,8,9,10};
size = 10;
public boolean add(E e) {
   ensureCapacityInternal(size + 1);  // Increments modCount!!
   elementData[size++] = e;
   return true;
}
private void ensureCapacityInternal(int minCapacity) {
   // ensureExplicitCapacity(11)
   ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private void ensureExplicitCapacity(int minCapacity) {
   modCount++;

   // 11 - 10 > 0
   if (minCapacity - elementData.length > 0)
       grow(minCapacity);
}
private void grow(int minCapacity) { // 11
   // 10
   int oldCapacity = elementData.length;
   // 15 newCapacity 是oldCapacity的1.5倍
   int newCapacity = oldCapacity + (oldCapacity >> 1);
   if (newCapacity - minCapacity < 0)
       newCapacity = minCapacity;
   if (newCapacity - MAX_ARRAY_SIZE > 0)
       newCapacity = hugeCapacity(minCapacity);
   // minCapacity is usually close to size, so this is a win:
   // {1,2,3,4,5,6,7,8,9,10} -- > {1,2,3,4,5,6,7,8,9,10,,,,,}
   elementData = Arrays.copyOf(elementData, newCapacity);
}

图解ArrayList源码的更多相关文章

  1. 【源码解析】- ArrayList源码解析,绝对详细

    ArrayList源码解析 简介 ArrayList是Java集合框架中非常常用的一种数据结构.继承自AbstractList,实现了List接口.底层基于数组来实现动态容量大小的控制,允许null值 ...

  2. java8 ArrayList源码阅读

    转载自 java8 ArrayList源码阅读 本文基于jdk1.8 JavaCollection库中有三类:List,Queue,Set 其中List,有三个子实现类:ArrayList,Vecto ...

  3. ArrayList源码解析

    ArrayList简介 ArrayList定义 1 public class ArrayList<E> extends AbstractList<E> implements L ...

  4. ArrayList源码剖析

    ArrayList简介 ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存. ArrayList不是线程安全的,只能用在单线程环境下,多线 ...

  5. 转:【Java集合源码剖析】ArrayList源码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/35568011   本篇博文参加了CSDN博文大赛,如果您觉得这篇博文不错,希望您能帮我投一 ...

  6. 顺序线性表 ---- ArrayList 源码解析及实现原理分析

    原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7738888.html ------------------------------------ ...

  7. ArrayList 源码(基于Java1.8)

    ArrayList 源码 ArrayList 基于数组实现,也就是类对变量 Object[]系列操作,封装为常用的add,remove,indexOf, contains本质是通过 size 计数器对 ...

  8. 【java提高】---ArrayList源码

    ArrayList源码 一.定义 public class ArrayList<E> extends AbstractList<E> implements List<E& ...

  9. Java集合干货——ArrayList源码分析

    ArrayList源码分析 前言 在之前的文章中我们提到过ArrayList,ArrayList可以说是每一个学java的人使用最多最熟练的集合了,但是知其然不知其所以然.关于ArrayList的具体 ...

  10. ArrayList 源码分析

    ArrayList 源码分析 1. 结构   首先我们需要对 ArrayList 有一个大致的了解就从结构来看看吧. 1. 继承   该类继承自 AbstractList 这个比较好说 2. 实现 这 ...

随机推荐

  1. 服务器漏洞修复:TLS 1.0 已启用、HSTS、CSP

    1.TLS 1.0 已启用 描述: 此 Web 服务器支持通过 TLS 1.0 加密.TLS 1.0 不被认为是"强密码术".根据 PCI 数据安全标准 3.2(.1) 的定义和要 ...

  2. 在网页上调起本机C#程序

    前言 最近开始整理笔记里的库存草稿,本文是 23 年 5 月创建的了(因为中途转移到 onedrive,可能还不止) 网页调起电脑程序是经常用到的场景,比如百度网盘下载,加入 QQ 群之类的 我之前做 ...

  3. thinkpad x250装manjaro linux,解决指纹和远程桌面问题

    前言 家里有个thinkpad x250闲置,平时主要用windows,大概隔一年半年装一次linux看看发展程度. 自己平时用的服务器一般装centos和debian,偶尔是ubuntu. 桌面li ...

  4. 鸿蒙NEXT开发案例:随机数生成

    [引言] 本项目是一个简单的随机数生成器应用,用户可以通过设置随机数的范围和个数,并选择是否允许生成重复的随机数,来生成所需的随机数列表.生成的结果可以通过点击"复制"按钮复制到剪 ...

  5. php 安装扩展 event

    本地环境php8.1,然后我想安装event扩展,找了找资料,直接一句话 sudo pecl install event 然后执行的过程中提示这些 configure.ac:165: the top ...

  6. 什么是静态(static)?什么是静态方法,静态变量,静态块和静态类?

    本文由 ImportNew - 唐小娟 翻译自 Journaldev.如需转载本文,请先参见文章末尾处的转载要求. static是Java中的一个关键字,我们不能声明普通外层类或者包为静态的.stat ...

  7. Git之message提交

    作用 编写格式化的 commit message 能够大大提高代码的维护效率. 比如: 可以提供更多的历史信息,方便快速浏览: 可以过滤某些 commit(比如文档改动),便于快速查找信息: 可以直接 ...

  8. 服务迁移之《tomcat性能优化》

    删除无用的connector,因为一般的tomcat前面都会挂有nginx服务 增加connnector使用的线程池的数量 删除没有用的listener host优化项:autoDeploy设置为fa ...

  9. NoSQL 述评

    作为主库的 nosql 只有 CockroachDB.TiKV 以及 MongoDB(从4.0后事务似乎可用了),CockrouchDB 已经收费,另外 YugabyteDB 也可选,但大家的反馈都不 ...

  10. Mybatis-plus关于代码生成器的使用

    1.添加依赖 2.在test包下创建一个CodeGet类,实现生成代码的功能.注意:全局配置.数据源配置一定要和自己的电脑配置一致! 3.执行CodeGet类中的main方法.打印台有如下图提示字样, ...