首页 > 其他分享 >ArrayList扩容代码分析

ArrayList扩容代码分析

时间:2022-09-20 18:01:41浏览次数:58  
标签:扩容 迭代 int ArrayList elementData newCapacity private minCapacity 代码

ArrayList扩容机制是在面试中频繁出现的问题,平时了解的比较含糊,特此记录!

注意:每次发生扩容,其容量扩充为原来的1.5倍左右,详见grow方法

常量

// 默认容量
private static final int DEFAULT_CAPACITY = 10;

// 用于空实例的空数组。
private static final Object[] EMPTY_ELEMENTDATA = {};

// 默认大小的空实例。我们将它与EMPTY_ELEMENTDATA区分开来,以了解添加第一个元素时要膨胀多少。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

// 集合中的元素存储在其中。当ArrayList中的elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA,并且在其添加第一个元素时,容量将被扩展为DEFAULT_CAPACITY。
transient Object[] elementData; 

无参构造

public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

add方法

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}
private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private void ensureExplicitCapacity(int minCapacity) {
    // modCount为此列表被结构修改的次数。
    // 结构修改是指改变列表的大小,或者以某种方式扰乱列表,从而导致正在进行的迭代可能产生不正确的结果。
    // 该字段由迭代器和listIterator方法返回的迭代器和列表迭代器实现使用。如果该字段的值意外更改,迭代器(或列表迭代器)将抛出ConcurrentModificationException异常,以响应next、remove、previous、set或add操作。
    // 这提供了fail-fast行为(一种错误检测机制,一旦检测到可能发生错误,就立马抛出异常,程序不继续往下执行),而不是在迭代期间面对并发修改时的非确定性行为。
    modCount++;

    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

扩容方法

private void grow(int minCapacity) {
    int oldCapacity = elementData.length;
    // 这里使用的是右移计算,比整除高效(注:对于偶数是除2,对于奇数是除2向下取整,所以不完全是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:
    // 将扩容前elementData中的数据复制出newCapacity个,没有的用null填充
    elementData = Arrays.copyOf(elementData, newCapacity);
}

标签:扩容,迭代,int,ArrayList,elementData,newCapacity,private,minCapacity,代码
From: https://www.cnblogs.com/daydreamer-fs/p/16711980.html

相关文章

  • 前端大文件上传解决方案实例代码
    ​前言:因自己负责的项目(jetty内嵌启动的SpringMvc)中需要实现文件上传,而自己对java文件上传这一块未接触过,且对Http协议较模糊,故这次采用渐进的方式来学习文件上传的原......
  • C#绘图 海报商品标题绘图代码
     //商品标题intcharNumber=15;//charNumber为要截取的每段的长度......
  • ArcGIS Pro 沿线飞行代码
    //Copyright2019Esri//LicensedundertheApacheLicense,Version2.0(the"License");//youmaynotusethisfileexceptincompliancewiththeLic......
  • 【Java基础】代码块
    1.代码块说明一对花括号表示,仅可以使用static修饰,可以用来对类或对象进行初始化。静态代码块:static修饰随着类的加载而执行,只执行一次,有多个时,按顺序执行。无法调用......
  • 国内外主流的 Git 代码托管网站
    国内外主流的Git代码托管网站#国外的三大Git代码托管平台都支持 DevOps,国内的主流托管平台均支持 DevOps 或者有条件(付费)支持.1.GitHub#https://github.......
  • HTML大文件上传解决方案实例代码
    ​在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现。先说下要求:PC端全平台支持,要求支持Windows,Mac,Linux支......
  • github强制远程代码覆盖本地过程
    假设在B设备上更新了代码,需要在A设备上同步保证B设备上的所有更改COMMIT并且PUSH到了github上A设备上清理工作区gitclean-df注意,这会删除当前的更改在A设备上pul......
  • Web大文件上传解决方案实例代码
    ​总结一下大文件分片上传和断点续传的问题。因为文件过大(比如1G以上),必须要考虑上传过程网络中断的情况。http的网络请求中本身就已经具备了分片上传功能,当传输的文件比较......
  • 中断设置cpu亲和性代码编写
    Linux中描述中断控制器的数据结构是struct irq_chip,因为不同芯片的中断控制器对其挂接的IRQ有不同的控制方法,因而这个结构体主要是由一组用于回调(callback),指向系统实际......
  • 断点续传 上传逻辑及代码
    整体逻辑如下    前台引用spark-md5获取文件唯一ID值,即md5值,前台将文件进行分片,通过该值进行后台校验,以此实现断点续传。    前台计算MD5,前台计算MD5快慢......