Java基础之ArrayList的扩容机制

Java基础之ArrayList的扩容机制

ArrayList简介

在Java中,ArrayList是一种常见的数据结构之一。它继承了AbstractList这个类,并且实现了List接口。ArrayList是基于数组实现的,可以动态地增加或减少数组的大小,所以可以自动扩容和缩容。

扩容机制

ArrayList的扩容机制指的是当ArrayList内部的元素个数超过了数组的容量时,ArrayList会自动扩容,将数组的容量扩大一倍。

ArrayList的扩容机制是在add()方法中实现的。每次调用add()方法进行添加元素时,都会动态检测数组是否满足扩容条件。如果不满足,则通过Arrays.copyOf()方法新建一个更大的数组,并将原数组中的元素复制到新数组中,然后将新元素添加到新数组的末尾。

具体的扩容机制如下:

  1. 调用add()方法,判断当前元素个数和数组容量是否相等,如果相等,则执行扩容操作。
  2. 计算新数组的容量,如果当前数组大小为0,则新数组容量为默认容量10,否则容量为原来的2倍。
  3. 调用Arrays.copyOf()方法,将原数组复制到新数组中。
  4. 将新元素添加到新数组的末尾。

示例1:扩容前的ArrayList打印容量和元素个数

import java.util.ArrayList;

public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        System.out.println("当前容量为:" + getCapacity(list));
        System.out.println("当前元素个数为:" + list.size());
    }

    private static int getCapacity(ArrayList list) {
        try {
            java.lang.reflect.Field field = ArrayList.class.getDeclaredField("elementData");
            field.setAccessible(true);
            return ((Object[])field.get(list)).length;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

输出:

当前容量为:10
当前元素个数为:0

示例2:扩容后的ArrayList打印容量和元素个数

import java.util.ArrayList;

public class ArrayListDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>(10);
        for(int i = 0; i < 11; i++) {
            list.add(i); // 添加11个元素
        }
        System.out.println("扩容后的容量为:" + getCapacity(list));
        System.out.println("当前元素个数为:" + list.size());
    }

    private static int getCapacity(ArrayList list) {
        try {
            java.lang.reflect.Field field = ArrayList.class.getDeclaredField("elementData");
            field.setAccessible(true);
            return ((Object[])field.get(list)).length;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

输出:

扩容后的容量为:20
当前元素个数为:11

总结

ArrayList在添加元素时,会检查当前元素个数是否超过数组的容量,如果超过了,就会自动扩容。扩容是通过创建一个新数组,将原数组中的元素复制到新数组中,再将新元素添加到新数组的末尾实现的。每次扩容,都会将数组的容量扩大一倍。扩容机制保证了ArrayList在添加元素时可以自动增加数组的容量,从而满足动态数组的需求。

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

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

相关文章

  • spring retry实现方法请求重试的使用步骤

    下面我将详细讲解使用Spring Retry实现请求重试的使用步骤。 1. 引入Spring Retry 在Spring Boot中,我们可以通过在pom.xml中引入以下依赖来使用Spring Retry: <dependency> <groupId>org.springframework.retry</groupId>…

    Java 2023年5月20日
    00
  • Spring Boot 快速集成 Redis的方法

    下面是详细讲解“Spring Boot 快速集成 Redis的方法”的完整攻略。 简介 Redis是目前比较流行的高性能缓存和NoSQL数据库,通过使用它可以提高项目的性能和并发能力。而Spring Boot是目前比较流行的Web框架之一,提供了快速开发、易扩展、自动化配置等特性。下面我们将使用Spring Boot来快速集成Redis。 步骤 第一步:添加…

    Java 2023年5月19日
    00
  • java编程之AC自动机工作原理与实现代码

    Java编程之AC自动机工作原理与实现代码 简介 AC自动机(Aho–Corasick automaton)是一种高效的多模式匹配算法。它能够同时对多个模式串进行匹配,并且时间复杂度是线性级别的。在字符串匹配、敏感词过滤、关键字过滤等领域广泛应用。本文将详细讲解AC自动机的工作原理以及在Java中实现AC自动机的代码。 工作原理 AC自动机的本质是构建了一个…

    Java 2023年5月18日
    00
  • SpringBoot实现项目健康检查与监控

    实现项目健康检查与监控是一个较为常见的需求,可以通过Spring Boot Actuator提供的功能来轻松实现,下面是使用Spring Boot Actuator实现项目健康检查与监控的攻略: 1. 添加依赖 首先需要在项目中引入Spring Boot Actuator的相关依赖,在项目的pom.xml文件中添加以下依赖: <dependency&g…

    Java 2023年5月20日
    00
  • Java如何实现通过键盘输入一个数组

    Java 可以通过 Scanner 类实现键盘输入一个数组。 具体步骤如下: 引入 Scanner 类 需要使用 java.util 包中的 Scanner 类,因此需要在程序开头声明引入这个包。 import java.util.Scanner; 定义 Scanner 对象 在程序中定义一个 Scanner 对象用于读取键盘输入: Scanner sc =…

    Java 2023年5月26日
    00
  • Java中JWT的使用的详细教程

    Java中JWT的使用的详细教程 什么是JWT JWT(JSON Web Token)是一个轻量级的身份验证和授权方法,它以 JSON 格式传输信息,可以被加密和签名,并具有各自的有效期。 一个 JWT Token 包含有三部分:Header、Payload和Signature。Header 部分是关于这个 Token 的基本信息,包括 Token 使用的算…

    Java 2023年5月20日
    00
  • Spring Boot中的Properties的使用详解

    SpringBoot中的Properties的使用详解 什么是Properties Properties是Java中处理属性文件的一个类。在SpringBoot中,我们可以使用application.properties或application.yml作为配置文件,来替代传统的XML配置文件,来配置服务器的相关信息。 application.properti…

    Java 2023年5月15日
    00
  • Geotools基本增删改查Feature

    postgis依赖 <dependency> <groupId>org.geotools</groupId> <artifactId>gt-main</artifactId> <version>27.2</version> </dependency> <de…

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