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

作者:逆流°只是风景-bjhxcc 时间:2021-11-26 13:12:46 

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);

来源:https://writer.blog.csdn.net/article/details/128564620

标签:Java,ArrayList,数组,扩容
0
投稿

猜你喜欢

  • java实战之桌球小游戏

    2022-04-22 20:40:13
  • Java并发包线程池ThreadPoolExecutor的实现

    2022-11-10 09:52:41
  • Java实现登录与注册页面

    2023-04-17 03:21:20
  • C#与C++ dll之间传递字符串string wchar_t* char* IntPtr问题

    2022-09-16 09:34:53
  • 导入maven项目各个注解均报错的解决方案

    2022-02-23 12:35:09
  • java开源项目jeecgboot的超详细解析

    2023-07-19 03:30:53
  • maven手动上传jar包示例及图文步骤过程

    2023-11-13 22:10:57
  • idea 创建properties配置文件的步骤

    2023-11-18 18:03:30
  • Java常量池知识点总结

    2023-01-09 10:23:09
  • Java实现显示指定类型的文件

    2021-10-26 11:30:37
  • springboot 自定义异常并捕获异常返给前端的实现代码

    2022-07-23 03:09:52
  • Java实现答答租车系统

    2022-07-12 01:38:17
  • springboot+mybatis-plus 两种方式打印sql语句的方法

    2022-12-29 13:41:11
  • Java实现远程控制技术完整源代码分享

    2022-04-10 20:31:53
  • springboot使用redis实现从配置到实战

    2023-05-05 09:49:08
  • java注解的类型知识点总结

    2022-11-04 00:26:02
  • HttpsURLConnection上传文件流(实例讲解)

    2022-03-02 16:54:47
  • 使用@Validated 和 BindingResult 遇到的坑及解决

    2022-12-18 20:36:28
  • java实现二分法的完整代码

    2023-08-18 22:09:06
  • java动态绑定和静态绑定用法实例详解

    2022-04-17 19:55:20
  • asp之家 软件编程 m.aspxhome.com