Java动态数组的实现过程

 更新时间:2026年01月08日 14:26:50   作者:当年明月思古今  
本文介绍了如何实现一个简单的动态数组,包括基础结构设计、核心功能实现、性能分析、实现特点以及改进建议,通过这个实现,我们能够更好地理解动态数组的工作原理和核心操作

在本文中,我们将深入探讨如何实现一个简单的动态数组(类似于Java中的ArrayList)。通过这个实现,我们可以更好地理解动态数组的工作原理和核心操作。

1. 基础结构设计

首先,让我们看看类的基本结构:

public class MyList {
    private int[] arr;        // 底层数组
    private int capacity = 10; // 数组容量
    private int size = 0;     // 当前元素个数
    private int extendRatio = 2; // 扩容倍数
}

这个实现包含了四个关键的成员变量:

  • arr: 存储实际数据的底层数组
  • capacity: 数组的容量
  • size: 当前实际存储的元素数量
  • extendRatio: 扩容时的倍数

2. 核心功能实现

2.1 基本操作

获取元素个数和容量

public int size() {
    return size;
}

public int capacity() {
    return capacity;
}

获取和设置元素

public int get(int index) {
    if (index < 0 || index >= size) {
        throw new IndexOutOfBoundsException();
    }
    return arr[index];
}

public void set(int index, int num) {
    if (index < 0 || index >= size) {
        throw new IndexOutOfBoundsException();
    }
    arr[index] = num;
}

2.2 添加元素

public void add(int item) {
    if (size == capacity) {
        extendCapacity();
    }
    arr[size] = item;
    size++;
}

2.3 插入元素

public void insert(int index, int item) {
    if (index < 0 || index >= size) {
        throw new IndexOutOfBoundsException();
    }
    if (size == capacity) {
        extendCapacity();
    }
    // 将index后的元素都向后移动一位
    for (int i = size - 1; i >= index; i--) {
        arr[i + 1] = arr[i];
    }
    arr[index] = item;
    size++;
}

2.4 删除元素

public int remove(int index) {
    if (index < 0 || index >= size) {
        throw new IndexOutOfBoundsException();
    }
    int num = arr[index];
    // 将index后的元素都向前移动一位
    for (int i = index; i < size - 1; i++) {
        arr[i] = arr[i + 1];
    }
    size--;
    return num;
}

2.5 扩容机制

private void extendCapacity() {
	// 新建一个长度为原数组 extendRatio 倍的新数组,并将原数组复制到新数组
    arr = Arrays.copyOf(arr, extendRatio);
    // 更新列表容量
    capacity = arr.length;
}

3. 性能分析

时间复杂度

  • 访问元素 (get/set): O(1)
  • 在末尾添加元素 (add): 平均O(1)
  • 插入元素 (insert): O(n)
  • 删除元素 (remove): O(n)

空间复杂度

  • 初始空间复杂度: O(1)
  • 扩容后的空间复杂度: O(n)

4. 实现特点

  • 动态扩容:当数组空间不足时,会自动扩容为原来的2倍。
  • 边界检查:所有的操作都会进行严格的边界检查,防止数组越界。
  • 数据搬移:在插入和删除操作时,需要移动元素,这是数组实现的一个缺点。

5. 改进建议

  1. 考虑添加收缩机制,当数组使用率过低时减少容量
  2. 可以支持泛型,使其能够存储任意类型的数据
  3. 优化扩容机制,使用更灵活的扩容策略
  4. 添加迭代器支持,提供更方便的遍历方式

总结

这个简单的动态数组实现展示了数据结构中最基本的一些概念:动态扩容、边界检查、元素操作等。通过理解这些基础实现,我们可以更好地理解Java中ArrayList等集合类的工作原理。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java窗体居中显示的2种方法(实例讲解)

    Java窗体居中显示的2种方法(实例讲解)

    下面小编就为大家带来一篇Java窗体居中显示的2种方法(实例讲解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Spring Boot拓展XML格式的请求和响应操作过程

    Spring Boot拓展XML格式的请求和响应操作过程

    在我们开发过程中,我们经常使用的参数绝大多少事HTML和JSON格式的请求和响应处理,但是我们在实际开发过程中,我们可能经历一些,比如对于XML格式的请求,本文给大家介绍Spring Boot拓展XML格式的请求和响应,感兴趣的朋友一起看看吧
    2023-10-10
  • java项目中常用指标UV PV QPS TPS含义以及统计方法

    java项目中常用指标UV PV QPS TPS含义以及统计方法

    文章介绍了现代Web应用中性能监控和分析的重要性,涵盖了UV、PV、QPS、TPS等关键指标的统计方法,并提供了示例代码,同时,文章还讨论了性能优化和瓶颈分析的策略,以及使用Grafana等可视化工具进行监控与告警的重要性
    2025-01-01
  • Spring中的两种代理JDK和CGLIB的区别浅谈

    Spring中的两种代理JDK和CGLIB的区别浅谈

    本篇文章中主要介绍了Spring中的两种代理JDK和CGLIB的区别浅谈,详解的介绍了JDK和CGLIB的原理和方法,有需要的朋友可以了解一下
    2017-04-04
  • SpringBoot Swagger2 接口规范示例详解

    SpringBoot Swagger2 接口规范示例详解

    Swagger(在谷歌、IBM、微软等公司的支持下)做了一个公共的文档风格来填补上述问题,在本文中,我们将会学习怎么使用Swagger的 Swagger2注解去生成REST API文档,感兴趣的朋友一起看看吧
    2023-12-12
  • 在Java中将Markdown转换为Word、PDF和HTML的常见实现方式

    在Java中将Markdown转换为Word、PDF和HTML的常见实现方式

    在软件开发和技术写作领域,Markdown 已成为一种被广泛使用的轻量级标记语言,但在实际应用中,Markdown 文件往往需要被转换为更通用的格式,本文将分享如何在 Java 环境下实现 Markdown 转换为 Word、PDF 和 HTML,需要的朋友可以参考下
    2025-09-09
  • Java.toCharArray()和charAt()的效率对比分析

    Java.toCharArray()和charAt()的效率对比分析

    这篇文章主要介绍了Java.toCharArray()和charAt()的效率对比分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java计算两个汉字相似度的实现方法

    Java计算两个汉字相似度的实现方法

    有时候我们希望计算两个汉字的相似度,比如文本的 OCR 等场景,用于识别纠正,本文给大家详细介绍了Java计算两个汉字相似度的实现方法,文中有详细的实现代码,需要的朋友可以参考下
    2023-11-11
  • Spring Scheduler定时任务实战指南(零基础入门任务调度)

    Spring Scheduler定时任务实战指南(零基础入门任务调度)

    本文介绍SpringScheduler在电商订单超时处理中的应用,涵盖启用定时任务、使用@Scheduled注解、cron表达式配置、线程池优化及异步执行等核心内容,本文给大家介绍Spring Scheduler定时任务实战指南,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • Kafka是什么及如何使用SpringBoot对接Kafka(最新推荐)

    Kafka是什么及如何使用SpringBoot对接Kafka(最新推荐)

    这篇文章主要介绍了Kafka是什么,以及如何使用SpringBoot对接Kafka,今天我们通过一个Demo讲解了在SpringBoot中如何对接Kafka,也介绍了下关键类 KafkaTemplate,需要的朋友可以参考下
    2023-11-11

最新评论