浅谈Java中ArrayList的扩容机制

yizhihongxing

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

相关文章

  • openbugs抽样数据基本操作

    当然,我很乐意为您提供OpenBUGS抽样数据基本操作的攻略。以下是详细的步骤和示例: 步骤1:了解OpenBUGS OpenBUGS是一种用于贝叶斯统计建模的软件,它可以用于模拟和分析复杂的概率模型。OpenBUGS使用Gibbs采样和Metropolis-Hastings算法来生成后验分布的样本。 步骤2:准备数据 在使用OpenBUGS之前,需要准备好…

    other 2023年5月6日
    00
  • Spring复杂对象创建的方式小结

    以下是使用标准的Markdown格式文本,详细讲解Spring复杂对象创建的方式的完整攻略: Spring复杂对象创建的方式小结 1. 构造函数注入 构造函数注入是一种常见的方式,通过构造函数将依赖项注入到目标对象中。以下是一个示例: public class UserService { private UserRepository userReposito…

    other 2023年10月14日
    00
  • rabbitmqstomp连接

    RabbitMQ STOMP连接攻略 RabbitMQ是一个开源的消息代理软件,支持多种消息协议,包括AMQP、MQTT和STOMP等。STOMP(Simple Oriented Messaging Protocol)是一种简单的文本协议,用于在客户端和消息代理之间传输消息。本攻略将介绍如何STOMP协议连接RabbitMQ,包括STOMP协议的基本概念、R…

    other 2023年5月7日
    00
  • vue构建单页面应用实战

    下面我将详细讲解如何使用Vue构建单页面应用的完整攻略。 1. 环境搭建 首先,我们需要搭建Vue的开发环境,需要安装Node.js和Vue CLI。Node.js可以从官网(https://nodejs.org/en/)下载安装包,Vue CLI可以通过npm来安装: npm install -g @vue/cli 2. 创建项目 在安装好Vue CLI之…

    other 2023年6月27日
    00
  • centos7环境下修改主机名

    CentOS7环境下修改主机名 在CentOS7中,修改主机名是一个常见的操作,本文将介绍如何在CentOS7环境下修改主机名。 步骤一:打开命令终端 首先,需要使用命令终端来操作CentOS7系统。可以通过按下Ctrl + Alt + T键或者搜索终端打开命令终端。 步骤二:切换到root用户 修改主机名需要root权限,可以使用以下命令切换到root用户…

    其他 2023年3月28日
    00
  • c语言把整数转为字符串

    当然,我可以为您提供有关“C语言把整数转为字符串”的完整攻略,以下是详细说明: 什么是C语言把整数转为字符串? C语言把整数转为字符串是一种将整数类型的数据转换为字符串类型的的方法。这个方法可以帮助您将整数的数据转换为字符串类型的数据,以便在程序中进行字符串操作。 C语言整数转为字符串的使用攻略 以下是C语言把整数转为字符串的攻略: 步骤1:包含头文件 在程…

    other 2023年5月7日
    00
  • R语言变量重编码、重命名的操作

    R语言变量重编码、重命名的操作攻略 在R语言中,变量重编码和重命名是常见的数据处理操作。本攻略将详细介绍如何进行这些操作,并提供两个示例说明。 变量重编码 变量重编码是将原始变量的取值映射到新的取值上,常用于将分类变量转换为数值变量或者将原始取值进行分组。以下是变量重编码的步骤: 创建一个映射表,将原始取值与新取值进行对应。可以使用ifelse()函数、ca…

    other 2023年8月8日
    00
  • gorm操作MySql数据库的方法

    GORM操作MySQL数据库的方法攻略 GORM是一个Go语言的ORM(对象关系映射)库,它提供了一种简单而强大的方式来操作MySQL数据库。下面是使用GORM进行MySQL数据库操作的完整攻略。 步骤一:安装GORM和MySQL驱动 首先,你需要安装GORM和MySQL驱动。可以使用以下命令来安装它们: go get -u gorm.io/gorm go …

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