查看: 67|回覆: 0

[教程] Java动态数组的实现过程

[複製鏈接]

4

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2009-12-9
發表於 2026-1-8 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;
    }
    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 = 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 ArrayList的基本概念和作用及动态数组的机制与性能
  • 使用Java实现在Excel中添加动态数组公式
  • Java中的动态数组和栈Vector Stack使用区别介绍
  • Java动态数组ArrayList实现动态原理
  • ArrayList源码探秘之Java动态数组的实现
  • Java ArrayList集合详解(Java动态数组)
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部