关于Java的ArrayList数组自动扩容机制

 更新时间:2023年05月16日 10:52:07   作者:逆流°只是风景-bjhxcc  
这篇文章主要介绍了关于Java的ArrayList数组自动扩容机制,ArrayList底层是基于数组实现的,是一个动态数组,自动扩容,不是线程安全的,只能用在单线程环境下,需要的朋友可以参考下

ArrayList介绍

  • ArrayList底层是基于数组实现的,是一个动态数组,自动扩容。
  • ArrayList不是线程安全的,只能用在单线程环境下。
  • 实现了Serializable接口,因此它支持序列化,能够通过序列化传输;
  • 实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问;
  • 实现了Cloneable接口,能被克隆。

动态扩容

初始化

JDK1.7通过无参构造方法(初始长度默认10,以默认的大小来初始化内部的数组)、有参构造方法对数组进行初始化。

确保内部容量

通过判断,如果够则不进行操作;容量不够就扩充来确保内部容量。

1. ensureCapacityInternal方法名的英文大致是“确保内部容量”,size表示的是执行添加之前的元素个数,并非ArrayList的容量,容量应该是数组elementData的长度。ensureCapacityInternal该方法通过将现有的元素个数数组的容量比较。看如果需要扩容,则扩容。

2. 是将要添加的元素放置到相应的数组中。

根据传入的最小需要容量minCapacity来和数组的容量长度对比,如果minCapacity大于或等于数组容量,则需要进行扩容。

扩容

private void grow(int minCapacity) {
    // overflow-conscious code
    int oldCapacity = elementData.length;
    // jdk1.7采用位运算比以前的计算方式更快
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    //jdk1.7这里增加了对元素个数的最大个数判断,MAX_ARRAY_SIZE 为int最大值减去8。
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    // minCapacity is usually close to size, so this is a win:
    // 最重要的复制元素方法   Arrays.copyOf() 
    elementData = Arrays.copyOf(elementData, newCapacity);
}

综述:ArrayList在第一次插入元素add()时分配10(默认)个对象空间。假如有20个数据需要添加,那么会在第11个数据的时候(原始数组容量存满时),按照1.5倍增长;

之后扩容会按照1.5倍增长(10、15、22、、、)。

每次扩容都是通过Arrays.copyOf(elementData, newCapacity) 这样的方式实现的。ArrayList的自动扩容机制底层借助于System实现System.arraycopy(0,oldsrc,0,newsrc,length);

到此这篇关于关于Java的ArrayList数组自动扩容机制的文章就介绍到这了,更多相关ArrayList数组自动扩容内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中Parser的用法

    Java中Parser的用法

    这篇文章主要介绍了Java Parser使用指南,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Java 动态代理的多种实现方式

    Java 动态代理的多种实现方式

    动态代理实际上是JVM在运行期动态创建class字节码并加载的过程。本文讲述了Java 动态代理的多种实现方式,感兴趣的朋友可以选择适合自己的方式
    2021-06-06
  • 解决IDEA开发工具右侧没有Maven工具栏的问题

    解决IDEA开发工具右侧没有Maven工具栏的问题

    这篇文章主要给大家解决了IDEA开发工具右侧没有Maven工具栏的问题,文中有详细的解决步骤,如果有遇到一样问题的小伙伴,可以参考阅读本文
    2023-09-09
  • java中TCP实现回显服务器及客户端

    java中TCP实现回显服务器及客户端

    本文主要介绍了java中TCP实现回显服务器及客户端,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • SpringBoot面试突击之过滤器和拦截器区别详解

    SpringBoot面试突击之过滤器和拦截器区别详解

    过滤器(Filter)和拦截器(Interceptor)都是基于 AOP(Aspect Oriented Programming,面向切面编程)思想实现的,用来解决项目中某一类问题的两种“工具”,但二者有着明显的差距,接下来我们一起来看
    2022-10-10
  • SpringCloud 2020-Ribbon负载均衡服务调用的实现

    SpringCloud 2020-Ribbon负载均衡服务调用的实现

    这篇文章主要介绍了SpringCloud 2020-Ribbon负载均衡服务调用的实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Springboot整合EasyExcel实现Excel文件上传方式

    Springboot整合EasyExcel实现Excel文件上传方式

    这篇文章主要介绍了Springboot整合EasyExcel实现Excel文件上传方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • 解读nextLine().split(“[\\s]“)的意思

    解读nextLine().split(“[\\s]“)的意思

    这篇文章主要介绍了解读nextLine().split(“[\\s]“)的意思,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 使用idea自动生成序列化ID全过程

    使用idea自动生成序列化ID全过程

    这篇文章主要介绍了使用idea自动生成序列化ID全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 浅谈SpringCache与redis集成实现缓存解决方案

    浅谈SpringCache与redis集成实现缓存解决方案

    本篇文章主要介绍了浅谈SpringCache与redis集成实现缓存解决方案,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12

最新评论