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 扩容详解

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 虚拟机安装gcc「建议收藏」

    虚拟机安装gcc「建议收藏」(确保虚拟机网络通畅)1在虚拟机桌面上右击【打开终端】2输入sudoapt-getupdate回车输入开机密码(输入时密码并不显示,输完后回车)等待出现下一步指示3输入sudoapt-getinstallgcc回车输入密码等待(我等了约30min)出现下一步指示4输入gcc–version回车完…

  • java 错误:非法字符:“\ufeff”

    java 错误:非法字符:“\ufeff”java 错误:非法字符:“\ufeff”

  • Java学习之spring MVC常用注解

    Java学习之springMVC常用注解0x00前言续上篇文章的内容继续来记录springmvc会常用到的一些注解。0x01常用注解RequestParam注解@Controller

    2021年12月12日
  • Asp.net Web.Config – 配置元素customErrors

    Asp.net Web.Config – 配置元素customErrorsAsp.netWeb.Config-配置元素customErrors Asp.net配置文件的配置方式,其实在MSDN里面是写得最清楚的了。可惜之前一直未曾了解到MSDN的强大。  先贴个地址:http://msdn.microsoft.com/zh-cn/library/dayb112d(v=vs.80).aspx,然后逐个分析。我希望自己能够从头到尾认真学完这系列东西。为了不至于让自己太早放弃,我决定从自己用过的配置文件学起,然后逐渐接触那些比较生疏,和少用的。一、customErro

  • 卸载Notepad++!事实已证明,它更牛逼……

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:lucida lucida.me/blog/sublime-text-complete-guide/ 摘要(A…

  • iOS 开发之实现 App 消息推送(最新)[通俗易懂]

    iOS 开发之实现 App 消息推送(最新)[通俗易懂]今天就由本菜鸟给大家做一个简单的IOSApp消息推送教程吧!一切从0开始,包括XCode6,IOS8,以及苹果开发者中心最新如何注册应用,申请证书以及下载配置概要文件,相信很多刚开始接触ios的人会很想了解一下。(ps:网上看了一下虽然有很多讲述推送的好教程,我也是看着一步步学会的,但是这些教程的时间都是去年或者更早时期的,对引导新手来说不是很合适)

发表回复

您的电子邮箱地址不会被公开。

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