JDK1.8 ArrayList 扩容详解

JDK1.8 ArrayList 扩容详解arraylist这个数据结构比较简单,总体来说,arraylist底层结构是数组,他的很多方法都是从数组上面演变而来的,下面分析下arraylist的扩容机制,每次在add()一个元素时,arraylist都需要对这个list的容量进行一个判断。如果容量够,直接添加,否则需要进行扩容。在1.8arraylist这个类中,扩容调用的是grow()方法,通过grow()方法中调用的Array…

大家好,又见面了,我是你们的朋友全栈君。

arraylist这个数据结构比较简单,总体来说,arraylist 底层结构是数组,他的很多方法都是从数组上面演变而来的,下面分析下arraylist的扩容机制,

每次在add()一个元素时,arraylist都需要对这个list的容量进行一个判断。如果容量够,直接添加,否则需要进行扩容。在1.8 arraylist这个类中,扩容调用的是grow()方法,通过grow()方法中调用的Arrays.copyof()方法进行对原数组的复制,在通过调用System.arraycopy()方法进行复制,达到扩容的目的

几个重要的初始化值

存储数组元素的缓冲区
// non-private to simplify nested class access
transient Object[] elementData; 
默认空数组元素
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
默认初始化容量
private static final int DEFAULT_CAPACITY = 10;
数组的大小
private int size;
记录被修改的次数
protected transient int modCount = 0;
数组的最大值
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8

几个重要的方法

一个空的构造方法

默认数组的长度为10
public ArrayList() {
    this.elementData  = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

添加元素的方法,

public boolean add(E e) {
扩充长度,在原来的大小上面加1
// Increments modCount!!
    ensureCapacityInternal(size + 1);  
添加元素
    elementData[size++] = e;
    return true;
}

确认内部容量

private void ensureCapacityInternal(int minCapacity) {
    ensureExplicitCapacity(
calculateCapacity(elementData, minCapacity));
}

计算容量

private static int calculateCapacity (Object[] elementData, int minCapacity) {
如果这个数组等于空,返回最大的容量,否则,还是原来的容量
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return minCapacity;
    }

确认扩展容量

private void ensureExplicitCapacity(int minCapacity) {
修改次数加1
    modCount++;
如果容量不够,调用增加容量方法
    // overflow-conscious code
    if (minCapacity - elementData.length > 0)
        grow(minCapacity);
}

扩展方法

private void grow(int minCapacity) {
    // overflow-conscious code
获取原来数组容量的长度
    int oldCapacity = elementData.length;
新增加的容量长度为原来容量的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 = Arrays.copyOf(elementData, newCapacity);
}

数组工具类中的复制方法

public static <T> T[] copyOf (T[] original, int newLength) {
    return (T[]) copyOf(original, newLength, original.getClass());
}

具体的复制方法

public static <T,U> T[] copyOf(U[] original, int newLength, 
Class<? extends T[]> newType) {
    @SuppressWarnings("unchecked")
获得者数组对象
    T[] copy = ((Object)newType == (Object)Object[].class)
        ? (T[]) new Object[newLength]
        : (T[]) Array.newInstance(newType.getComponentType(), newLength);

调用系统的方法增加数组容量
    System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));
    return copy;
}

 

欢迎大家关注我的个人微信公众号了解更多内容:JDK1.8 ArrayList 扩容详解

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/142845.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MySQL的锁机制_线程安全与锁机制

    MySQL的锁机制_线程安全与锁机制一、锁的作用数据库使用锁是为了支持对共享资源的并发访问,同时保证数据的完整性和一致性。二、锁的类型2.1全局锁全局锁意味着对整个数据库实例加上锁。通常使用的是全局读锁——Flushtableswithreadlock(FTWRL)。使用这个命令,可以使整个库处于只读状态,其他线程的无论使用DML、DDL甚至是事务的提交语句都会无法正常执行。使用场景做全库逻辑备份,对所有的表数据进行锁定,保证数据的一致性。问题但是FTWRL的全局锁方案有比较严重的缺

    2022年9月30日
    1
  • 什么是SOA?

    SOA的定义SOA(Service-OrientedArchitecture),中文全称:面向服务的架构。SOA是一种粗粒度、松耦合服务架构,服务之间通过简单、精确定义接口进行通讯,不涉及底层编程接口和通讯模型。SOA的基本特征可从企业外部访问  随时可用  粗粒度的服务接口分级 松散耦合 可重用的服务服务接口设计管理  标准化的服务接口  支持各种消息模式 精…

    2022年4月4日
    43
  • egg-swagger token验证无效解决方案

    egg-swagger token验证无效解决方案先看效果注意,我这边只讲重点1、首先,egg-swagger怎么安装看我的这篇egg-swaggerdemo无数据库版2、无swagger的token验证我的这篇eggjstoken生成和验证demo3、我这边只讲,重点4、我下的是egg-swagger-doc依赖5、你发现你路由/listjwt可以验证,而swagger-ui的/api/user/list却不能验证正文你配置完swagger-ui之后要配置几个东西第一:你…

    2022年9月4日
    2
  • python检验多重共线性_利用Python进行VIF检验[通俗易懂]

    python检验多重共线性_利用Python进行VIF检验[通俗易懂]在统计学中,多重共线性(共线性)是指多元线性回归模型中的某个预测变量(自变量/解释变量)可以以相当大的准确度通过其他预测变量线性预估。在这种情况下,模型或数据的微小变化就可能导致多元回归模型的系数估计值出现不规律地改变,可能造成如下后果:回归系数的普通最小二乘估计量可靠度降低。如图1与2所示,随着多重共线性程度的提高,参数方差(表示变量与的相关度)会急剧上升到很大的水平,理论上使最小二…

    2022年6月14日
    44
  • 基于机器学习的文本分类算法的研究[通俗易懂]

    基于机器学习的文本分类算法的研究[通俗易懂]1.简述文本分类的方法属于有监督的学习方法,分类过程包括文本预处理、特征抽取、降维、分类和模型评价。本文首先研究了文本分类的背景,中文分词算法。然后是对各种各样的特征抽取进行研究,包括词项频率-逆文档频率和word2vec,降维方法有主成分分析法和潜在索引分析,最后是对分类算法进行研究,包括朴素贝叶斯的多变量贝努利模型和多项式模型,支持向量机和深度学习方法。深度学习方法包括多层感知机,卷积神…

    2022年6月8日
    37
  • 金山词霸2009sp3 (解决字典消失、屏幕不能取词问题)

    金山词霸2009sp3 (解决字典消失、屏幕不能取词问题)姓名:杨正祎(阿一)互联网工作者,专注于互联网项目开发与开发,擅长于符合Web标准的页面设计制作,互联网项目管理。现就职于上海沪江网http://www.cnblogs.com/JustinYoung/archive/2009/05/10/jinshanciba2009sp3.html   金山词霸2009sp3激活成功教程版下载(解决字典消失、屏幕不能取词问题)

    2022年7月15日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号