浅谈Java中ArrayList的扩容机制

浅谈Java中ArrayList的扩容机制

什么是ArrayList

ArrayList是Java集合框架中的一种动态数组实现,可以动态增加和删除元素。并且它可以存储任意类型的数据,因为它使用泛型进行类型参数化。

动态扩容机制

当ArrayList存储的元素数量超过容器长度时,ArrayList会自动调用自身内部的动态扩容方法,将当前数组长度增加一倍。

具体步骤如下:

  1. 判断是否需要扩容,如果需要就进入下一步操作。
  2. 新建一个长度为原 ArrayList 的 1.5 倍的 Object 数组 newElementData。
  3. 将原 ArrayList 中的元素复制到新数组中。
  4. 将原 ArrayList 的 elementData 属性指向新数组 newElementData。

示例代码:

List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    list.add(i);
    System.out.println("当前容器长度:" + list.size() + ",当前数组长度:" + getArrayListCapacity(list));
}

public static int getArrayListCapacity(ArrayList<?> list) {
    try {
        Field field = ArrayList.class.getDeclaredField("elementData");
        field.setAccessible(true);
        return ((Object[]) field.get(list)).length;
    } catch (NoSuchFieldException | IllegalAccessException e) {
        return -1;
    }
}

输出结果:

当前容器长度:1,当前数组长度:10
当前容器长度:2,当前数组长度:10
当前容器长度:3,当前数组长度:10
当前容器长度:4,当前数组长度:10
当前容器长度:5,当前数组长度:10
当前容器长度:6,当前数组长度:10
当前容器长度:7,当前数组长度:10
当前容器长度:8,当前数组长度:10
当前容器长度:9,当前数组长度:10
当前容器长度:10,当前数组长度:10
当前容器长度:11,当前数组长度:15
当前容器长度:12,当前数组长度:15

从输出结果中可以看出,数组的大小从原来的10变成了15,即增加了一半。

避免无效扩容

ArrayList的动态扩容操作会影响性能,所以为了避免无效扩容,在初始化ArrayList时可以给它指定一个适当的容量。

示例代码:

List<Integer> list = new ArrayList<>(20);
for (int i = 0; i < 10; i++) {
    list.add(i);
    System.out.println("当前容器长度:" + list.size() + ",当前数组长度:" + getArrayListCapacity(list));
}

public static int getArrayListCapacity(ArrayList<?> list) {
    try {
        Field field = ArrayList.class.getDeclaredField("elementData");
        field.setAccessible(true);
        return ((Object[]) field.get(list)).length;
    } catch (NoSuchFieldException | IllegalAccessException e) {
        return -1;
    }
}

输出结果:

当前容器长度:1,当前数组长度:20
当前容器长度:2,当前数组长度:20
当前容器长度:3,当前数组长度:20
当前容器长度:4,当前数组长度:20
当前容器长度:5,当前数组长度:20
当前容器长度:6,当前数组长度:20
当前容器长度:7,当前数组长度:20
当前容器长度:8,当前数组长度:20
当前容器长度:9,当前数组长度:20
当前容器长度:10,当前数组长度:20

从输出结果中可以看出,当初始化ArrayList时,指定了容量为20,因此数组长度始终为20,没有出现扩容操作。

总结

ArrayList的扩容机制是它能够动态增加和删除元素的关键。合理的初始化容量和优化扩容操作都可以提高ArrayList的性能,避免无效扩容。在使用ArrayList时需要注意容器的大小和元素类型。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Java中ArrayList的扩容机制 - Python技术站

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

相关文章

  • 开源Web自动化测试工具Selenium IDE

    Selenium IDE是一款开源的Web自动化测试工具,可以帮助开发人员快速创建和执行自动化测试脚本。本文将详细讲解Selenium IDE的使用方法,包括安装、录制和执行测试脚本,并提供两个示例说明。 安装Selenium IDE Selenium IDE是一款基于浏览器的插件,可以在Chrome和Firefox浏览器中使用。可以从Chrome Web …

    other 2023年5月5日
    00
  • axios详解

    Axios详解 Axios是一个基于Promise的HTTP客户端,用于浏览器和Node.js。它可以在浏览器中发送异步请求,也可以在Node.js中发送HTTP请求。Axios具有以下特点: 支持Promise API 支持拦截请求和响应 支持取消请求 自动转换JSON数据 支持客户端防XSRF 安装 在使用Axios之前,我们需要先安装它。可以使用npm…

    other 2023年5月7日
    00
  • linux 进行批量下载文件操作

    linux 进行批量下载文件操作 在日常的工作中,我们可能会需要下载许多文件,如果一个个手动下载会比较耗时费力。不过在 Linux 系统中,我们可以使用一些命令来进行批量下载,提高我们的效率。 使用 wget 下载文件 wget 是一个常用的下载工具,它可以从 HTTP、HTTPS、FTP 等协议中下载文件。使用 wget 下载文件非常简单,只需要在终端中输…

    其他 2023年3月29日
    00
  • 小米miui7开发版下载地址 小米miui7官方刷机包/支持机型

    小米MIUI7开发版下载地址及刷机攻略 下载地址 小米MIUI7开发版的下载地址可以在小米官方网站上找到。以下是下载地址的步骤: 打开小米官方网站(www.mi.com)。 在网站的搜索栏中输入\”MIUI7开发版\”。 在搜索结果中找到\”MIUI7开发版下载\”页面,并点击进入。 在下载页面中,找到适用于你的手机型号的MIUI7开发版刷机包,并点击下载。…

    other 2023年8月4日
    00
  • javascriptdom编程艺术

    JavaScript DOM编程艺术是一本介绍如何使用JavaScript操作HTML和CSS的经典书籍。以下是使用JavaScript DOM编程艺术的完整攻略: 首先,创建一个HTML文档,并在其中添加一些元素。例如,可以创建一个包含一个按钮和一个文本框的HTML文档: “`html JavaScript DOM Programming Submit …

    other 2023年5月9日
    00
  • 初步学习Java中线程的实现与生命周期

    初步学习Java中线程的实现与生命周期攻略 什么是线程? 线程是程序执行的一个单元,也是进程内的一个独立控制流。 一个进程中可以有多个线程,它们共享内存空间和一些进程级的数据,但每个线程有自己的计数器、栈空间及局部变量。 线程的使用可以提高程序的效率。 常用的线程实现方式 Java中有两种创建线程的方式:继承Thread类和实现Runnable接口。 继承T…

    other 2023年6月27日
    00
  • Android多语言适配的示例代码(兼容7.0+)

    下面我将详细讲解Android多语言适配的示例代码,包含以下几个方面: 如何配置多语言资源 如何在运行时设置当前语言 相关代码示例说明 如何配置多语言资源 首先,在res目录下新建values-xx文件夹,其中xx代表对应的语言代码,比如values-en代表英语资源,values-zh代表中文资源。 然后在对应的values-xx文件夹下创建strings…

    other 2023年6月27日
    00
  • Mac 将mysql路径加入环境变量的方法

    以下是详细讲解 Mac 将 mysql 路径加入环境变量的方法的完整攻略。 1. 查看 Mysql 安装路径 首先需要查看一下你的 Mysql 安装路径。一般情况下,Mysql 的安装路径为 /usr/local/mysql。如果你使用 Homebrew 安装过 Mysql,则安装路径为 /usr/local/Cellar/mysql/{version_nu…

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