首页 > 其他分享 >ArrayList的扩容机制详解,解决面试难题!

ArrayList的扩容机制详解,解决面试难题!

时间:2024-02-01 22:01:21浏览次数:28  
标签:扩容 minCapacity 容量 MAX ArrayList 面试 详解 数组

前言

大家好,我是chowley,不知各位在面试中,是否被问过 ‘读没读过相关框架的源码?’ 这个经典问题?我最近就遇到了,虽然我之前读过,但这玩意干读不进味啊

今天我就来讲讲ArrayList,这个白家长谈的经典数据结构的扩容机制!

ArrayList

在Java的集合框架中,ArrayList是一个非常常用的动态数组实现。了解其内部扩容机制对于我们编写的代码十分有益。

1. 介绍

ArrayListjava.util包下的一个类,它实现了动态数组的数据结构。相比于传统数组,ArrayList具有自动扩容的特性,可以根据需要动态地调整数组的大小。

2. 扩容机制

ArrayList的元素数量接近或超过其当前容量时,就会触发扩容操作。ArrayList的扩容机制主要涉及以下几个关键参数:

  • elementData: 用于存储实际元素的数组。
  • size: 当前ArrayList中元素的个数。
  • DEFAULT_CAPACITY: 默认初始容量,一般为10。
  • MAX_ARRAY_SIZE: 数组的最大容量,一般为Integer.MAX_VALUE - 8

2.1 扩容触发条件

扩容会在以下两种情况下触发:

  1. 添加元素时,size超过elementData的长度

  2. 使用带有指定初始容量的构造方法,并且该初始容量大于默认容量,也会触发扩容。

2.2 扩容操作过程

扩容的核心方法是 grow(int minCapacity)。下面是扩容的大致过程:

  1. 计算新容量:
    新容量一般为原容量的 1.5 倍,即 oldCapacity + (oldCapacity >> 1)。如果这个值仍然不足以容纳 minCapacity 个元素,那么新容量将被设置为 minCapacity

  2. 检查是否超过最大容量:

    如果新容量超过了 MAX_ARRAY_SIZE,则新容量将被设置为 Integer.MAX_VALUE。这是由于数组的最大长度是 Integer.MAX_VALUE

  3. 创建新数组并复制元素:

    利用 Arrays.copyOf 创建一个新的数组,并将原数组中的元素复制到新数组中。

  4. 替换原数组:

    elementData 指向新的数组。

2.3 扩容示例代码

以下是 ArrayList 扩容机制的示例代码:

private void grow(int minCapacity) {
    // 获取原容量
    int oldCapacity = elementData.length;
    // 计算新容量
    int newCapacity = oldCapacity + (oldCapacity >> 1);

    // 检查是否足够容纳minCapacity个元素
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;

    // 检查是否超过最大容量
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);

    // 创建新数组并复制元素
    elementData = Arrays.copyOf(elementData, newCapacity);
}

private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // 溢出
        throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
        Integer.MAX_VALUE :
        MAX_ARRAY_SIZE;
}

总结

了解ArrayList的扩容机制是编写高性能Java代码的重要一环。通过深入了解其内部实现,我们能够更好地利用这一数据结构,避免不必要的扩容操作,提高程序的效率。

希望通过本文的介绍,大家能够对ArrayList的扩容机制有一个清晰而深入的理解~

好了,以上就是本文的全部内容,如有问题欢迎留言讨论。

我是chowley,一个专注互联网技术和软件质量保障领域的博主,我们下次再见!

欢迎点赞、评论、收藏,it's important for me.

欢迎点赞、评论、收藏,it's important for me.

欢迎点赞、评论、收藏,it's important for me.

标签:扩容,minCapacity,容量,MAX,ArrayList,面试,详解,数组
From: https://blog.51cto.com/chowley/9536741

相关文章

  • 面试官:说一说你的第一个Java程序是怎么跑起来的?
    面试官:“说一说你第一个Java程序是怎么跑起来的?”我:“啊,您是说HelloWorld吗?”面试官:“嗯,没错,几十年过去了,还是helloworld......”我:“好滴!且听俺给您唠一唠”话不多说,直接上一段代码:/***class关键字:用于在Java中声明一个类*/publicclassStaffApplicationTests{......
  • 二进制详解 —— 从十进制入手,学习了解二进制
    目录二进制与整数之间的转换二进制转化为十进制十进制转化为二进制与浮点数之间的转换二进制小数➡️十进制小数十进制小数➡️二进制小数二进制我认为想要降低对新事物的恐惧,快速学会新知识,最重要的是学会类比旧事物、推理和举一反三。二进制也不例外,所以再学习二进制之前,我们先......
  • 应届生面试
      一、软件测试基础知识:软件测试的策略有哪些?黑盒测试、白盒测试、灰盒测试、静态测试、动态测试、手工测试、自动化测试、冒烟测试、回归测试单元测试的策略有哪些?逻辑覆盖、循环覆盖、同行评审、桌前检查、代码走查、代码评审、景泰数据流分析编写测试用例的方法有哪......
  • 搭建高效企业培训平台:教育系统源码开发详解
    为了更好地满足企业培训的需求,许多组织纷纷转向数字化教育,搭建高效的企业培训平台成为当务之急。本篇文章,小编将为您讲解教育系统源码的开发细节,为搭建一个功能强大、灵活高效的企业培训平台提供详尽的指南。 一、教育系统的基础架构1.1数据库设计众所周知,数据库设计是整个平台的......
  • Nginx-反向代理详解
    什么是NginxNginx是一个高性能的开源Web服务器和反向代理服务器。它具有轻量级、高并发、低内存消耗等特点,被广泛用于搭建静态资源服务器、负载均衡、反向代理等场景。本文介绍nginx的反向代理,其他内容敬请期待!什么是反向代理反向代理是一种代理服务器的配置模式,它代表服务器向......
  • 代码随想录算法训练营第四天 |24. 两两交换链表中的节点 | 19.删除链表的倒数第N个节
    142.环形链表II 已解答中等 相关标签相关企业 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,......
  • 面试官:SpringCloudGateway过滤器类型有哪些?
    在SpringCloudGateway中,过滤器是在请求到达目标服务之前或之后,执行某些特定操作的一种机制。例如,它可以实现对传入的请求进行验证、修改、日志记录、身份验证、流量控制等各种功能。在SpringCloudGateway中,过滤器总共分为以下两大类:局部过滤器:只作用于某一个路由(route......
  • 门的方向为何如此重要?探秘产品经理面试题的设计哲学
    大家好,我是小米!最近我在面试产品经理的时候遇到了一个有趣而又颇具深意的问题:厕所的门应该朝内还是朝外开?这个问题看似简单,却蕴含了很多关于产品设计的考量。今天,我们一起来深入剖析这个问题,看看我们在设计产品时应该如何权衡各种因素。背景介绍在日常生活中,我们常常在使用厕所的时......
  • 面试官:Mysql千万级大表如何进行深度分页优化?
    背景假如有一张千万级的订单表,这张表没有采用分区分表,也没有使用ES等技术,分页查询进行到一定深度分页之后(比如1000万行后)查询比较缓慢,我们该如何进行优化?数据准备订单表结构如下:CREATETABLE`t_order`(`id`BIGINT(20)UNSIGNEDNOTNULLAUTO_INCREMENTCOMMENT......
  • 神经网络优化篇:详解Batch Norm 为什么奏效?(Why does Batch Norm work?)
    BatchNorm为什么奏效?为什么Batch归一化会起作用呢?一个原因是,已经看到如何归一化输入特征值\(x\),使其均值为0,方差1,它又是怎样加速学习的,有一些从0到1而不是从1到1000的特征值,通过归一化所有的输入特征值\(x\),以获得类似范围的值,可以加速学习。所以Batch归一化起的作用的原因,直......