浅谈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日

相关文章

  • 在Linux 命令行终端分屏的两种工具

    在Linux命令行终端中,有时候需要同时运行多个命令或程序,为了方便查看和管理,可以使用终端分屏工具。下面将介绍两种常用的终端分屏工具: 1. tmux tmux是一款强大的终端复用工具,可以同时在一个终端窗口中运行多个终端会话,并能够在它们之间切换和管理。以下是使用tmux的基本流程: 1.1 安装和启动tmux 在终端中输入以下命令安装tmux: sud…

    other 2023年6月26日
    00
  • 苹果手机死机怎么办 iPhone各机型强制重启方法一览

    苹果手机死机怎么办 苹果手机死机并不是个罕见的问题,这时候需要进行强制重启操作来解决问题。各款iPhone机型的强制重启操作方式略有不同。下面就为大家详细介绍一下各款iPhone机型强制重启的操作方法。 iPhone 6s及其以下机型 按住手机上方的电源键和Home键不放; 等待苹果logo出现即可松开按钮。 iPhone 7/7 Plus机型 按住手机右侧…

    other 2023年6月27日
    00
  • 浅谈amd与cmd的作用与区别

    浅谈AMD与CMD的作用与区别 1. AMD和CMD的概述 AMD和CMD都是JavaScript的模块加载器。在ES6出现之前,JavaScript是没有官方的模块化标准的,但由于JavaScript已经成为应用非常广泛的语言,因此有人在此基础上对它进行了扩展,对于在此时期的JavaScript开发者来说,AMD和CMD就是他们首选的模块加载器之一。 AM…

    其他 2023年4月16日
    00
  • 怎么更改电脑硬盘D盘盘符图标?

    下面是更改电脑硬盘D盘盘符图标的完整攻略。 1. 准备工作 在更改硬盘D盘的盘符图标之前,需要先准备以下两个东西: 自定义的图标文件。可以在网上下载或者自己设计。注意图标文件的格式必须是.ico格式。 注册表编辑器。在 Windows 系统中,可以通过“运行”窗口或者搜索框打开注册表编辑器(regedit)。 2. 更改注册表项 步骤如下: 在注册表中找到 …

    other 2023年6月27日
    00
  • 详解浏览器渲染页面过程

    详解浏览器渲染页面过程的完整攻略 1. 解析HTML 当浏览器接收到HTML文档时,它会开始解析该文档。解析过程包括以下几个步骤: 词法分析:将HTML文档分解为一系列的标记(tokens),如标签、属性和文本内容。 语法分析:根据HTML规范,将标记组织成一个树状结构,即DOM树(Document Object Model)。 2. 构建DOM树 DOM树…

    other 2023年9月7日
    00
  • Android实用的Toast工具类封装

    Android实用的Toast工具类封装 在Android开发中,Toast是一个非常常用的组件,用于向用户展示简短信息的提示框。但是,每次使用Toast,都需要写一堆重复的代码,十分麻烦。因此,我们可以考虑封装一个Toast工具类,方便我们的使用。 实现步骤 1. 创建Toast工具类 在我们的项目中,创建一个名为ToastUtil的类,用于封装Toast…

    other 2023年6月25日
    00
  • Nginx用户认证配置方法详解(域名/目录)

    下面是Nginx用户认证配置方法详解的完整攻略。 什么是Nginx用户认证? 在Nginx中,用户认证是指通过验证用户名和密码,来限制特定路径或资源只能被特定用户访问。Nginx用户认证可以用于保护网站后台管理页面、个人文件存储和对特定内容的访问等场景。 Nginx用户认证配置方法 步骤1:安装htpasswd工具 htpasswd是一个用于生成和更新基于文…

    other 2023年6月27日
    00
  • c#写csv文件

    c#写csv文件 在许多数据交换场景中,CSV(逗号分隔符)文件格式是最流行的格式之一。CSV文件的简单架构便于实现和操作,而且大多数数据处理工具都能够读取和写入CSV文件。在C#中,我们可以使用System.IO命名空间中的StreamWriter类来写入CSV文件。下面我们将为您展示如何在C#中编写CSV文件。 第一步:准备CSV数据 为了编写CSV文件…

    其他 2023年3月28日
    00
合作推广
合作推广
分享本页
返回顶部