Java ArrayList扩容机制原理深入分析

Java ArrayList扩容机制原理深入分析

在 Java 中,ArrayList 是一种动态数组,它可以自动扩容以适应数据的增长。了解 ArrayList 扩容机制的原理,有助于我们更好地理解和使用 ArrayList,提高代码效率。

ArrayList 扩容机制

ArrayList 内部使用数组来存储元素,当向 ArrayList 中添加元素时,如果当前数组已满,就需要扩容。下面是 ArrayList 扩容的基本流程:

  1. 获取当前 ArrayList 的容量 capacity 和当前 ArrayList 已存储的元素个数 size;
  2. 判断当前数组是否已满,即 size == capacity
  3. 如果数组已满,创建一个新的容量是原来容量 1.5 倍的数组,并将原数组中的元素复制到新数组中;
  4. 新数组成为 ArrayList 的内部数组。

下面是一个简单的示例:

import java.util.ArrayList;

public class Demo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>(3);
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.add(6);
    }
}

在上面的例子中,我们创建了一个容量为 3 的 ArrayList,并往里面添加了 6 个元素。在添加第 4 个元素时,由于数组已满,系统调用了 grow() 方法进行扩容。下面是 grow() 方法的源码:

private void grow(int minCapacity) {
    // 获取当前 ArrayList 容量
    int oldCapacity = elementData.length;
    // 计算新容量大小
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    // 如果新容量不足以满足最小容量需求,就使用最小容量作为新容量
    if (newCapacity < minCapacity)
        newCapacity = minCapacity;
    // 创建新的数组,并将原数组的元素复制到新数组中
    elementData = Arrays.copyOf(elementData, newCapacity);
}

可以看到,在扩容时,系统会计算出新的容量大小,并将原数组的元素复制到新数组中,从而保证数据的顺序不变。需要注意的是,在计算新容量大小时,采用了位运算 >> 来代替除法,以提高代码效率。

另外,在调用 grow() 方法扩容时,如果我们向 ArrayList 中添加大量元素,扩容的次数可能很多,从而导致效率降低。因此,我们在使用 ArrayList 时,尽量预留一定的容量,避免频繁扩容。

下面是一个添加 100 000 个元素的例子,可以看到,在初始容量为 100 000 的情况下,并不会出现扩容的情况:

import java.util.ArrayList;

public class Demo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>(100000);
        for (int i = 0; i < 100000; i++) {
            list.add(i);
        }
    }
}

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java ArrayList扩容机制原理深入分析 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • JSP 开发之hibernate配置二级缓存的方法

    下面是详细讲解“JSP 开发之 hibernate 配置二级缓存的方法”的完整攻略。 简介 在使用 Hibernate 进行开发的时候,为了提高系统的性能,常常需要使用二级缓存来优化查询。本文将介绍如何在 Hibernate 中配置二级缓存。 步骤 1. 添加缓存依赖 为了使用 Hibernate 的二级缓存,需要添加相应的缓存依赖。 <!– Hib…

    Java 2023年6月15日
    00
  • Java实现插入排序算法可视化的示例代码

    下面详细讲解Java实现插入排序算法可视化的示例代码的完整攻略。 1. 插入排序算法 插入排序是一种简单的排序算法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增加1的有序表。插入排序的具体实现方式有两种:直接插入排序和二分插入排序。 以下是Java实现直接插入排序算法的示例代码: public void insertionS…

    Java 2023年5月19日
    00
  • SpringMVC项目访问controller时候报404的解决

    当我们在SpringMVC项目中访问controller时,有时候会遇到404错误,这可能是由于多种原因引起的。本文将提供一些解决404错误的方法,并提供两个示例来说明这些方法的使用。 方法一:检查请求路径 当我们访问controller时,首先要检查请求路径是否正确。如果请求路径不正确,服务器将无法找到相应的controller,从而返回404错误。以下是…

    Java 2023年5月17日
    00
  • Spring Cloud Config 使用本地配置文件方式

    下面是关于Spring Cloud Config使用本地配置文件的攻略: 什么是Spring Cloud Config? Spring Cloud Config 是一个分布式配置服务,目的是为分布式系统中的基础设施和微服务应用提供一种集中化的外部配置支持。 使用本地配置文件方式 步骤一:创建本地配置文件 在本地文件系统的一个目录下创建一个配置文件,比如:ap…

    Java 2023年5月19日
    00
  • 浅析java的foreach循环

    下面是针对“浅析Java的foreach循环”的完整攻略: 什么是foreach循环 foreach循环,也被称为增强型for循环,是Java语言中一种用于遍历数组和集合类的循环结构。通过foreach循环,我们可以简化数组和集合的遍历过程,不需要手动去控制下标或迭代器的使用。 foreach循环的语法 foreach循环的语法结构如下: for (元素类型…

    Java 2023年5月26日
    00
  • SpringBoot项目实现关闭数据库配置和springSecurity

    SpringBoot是一个非常流行的Java Web开发框架,它具有易用、快速开发、健壮性好等优点。在一些场景中我们需要关闭数据库配置或者关闭Spring Security,下面就具体介绍一下如何实现: 关闭数据库配置 在一些场景中,我们并不需要使用数据库,比如开发一个展示页面的网站,这时我们就可以关闭数据库配置。 步骤一:排除数据库依赖 在pom.xml文…

    Java 2023年5月20日
    00
  • MAC 命令行启动tomcat的详细介绍

    下面是启动 Tomcat 的详细攻略。 安装 Tomcat 在使用 MAC 命令行启动 Tomcat 之前,需要先安装 Tomcat。你可以在 Tomcat 的官网 https://tomcat.apache.org/ 下载最新版本的 Tomcat。安装方法如下: 将下载的 Tomcat 压缩包解压到你希望安装的目录中,例如 /opt/tomcat/。 打开…

    Java 2023年5月19日
    00
  • Java编程中更新XML文档的常用方法

    当需要更新XML文档时,Java编程中有多种常用的方法。本文将介绍Java编程中经常使用的两种方法。 方法一:使用DOM编程 DOM(文档对象模型)是一种Java内置的XML解析器。通常,使用DOM解析XML文档时,会将整个XML文件加载到内存中,构建一个XML的DOM树,程序员可以通过修改DOM树的方式来实现对XML文件的更新操作。 示例一:添加一个节点 …

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部