Dynamic Array in Java

2025年3月26日 | 阅读 9 分钟

数组是一种固定大小的同构数据结构。数组的局限性在于其大小固定。这意味着我们在声明数组时必须指定元素的数量。此时会产生一个问题:如果我们想插入一个元素,但没有更多的空间来容纳新元素怎么办?

这时,**动态数组**的概念就应运而生了。它动态地扩展数组的大小。动态数组,在 Java 中也称为 ArrayList,是基本的数据结构,它提供了一种灵活的方式来存储和操作元素集合。

什么是动态数组?

动态数组是一种**可变大小**的列表数据结构。当我们尝试插入元素而没有更多空间时,它会自动增长。它允许我们添加和删除元素。它在运行时使用堆分配内存。它可以在运行时更改其大小。

在 Java 中,ArrayList 是一个可调整大小的实现。它实现了 List 接口,并提供了所有与列表操作相关的 ArrayList 方法。与传统数组相比,ArrayList 具有许多优点,例如自动调整大小、易于使用以及与泛型类型的兼容性。动态数组的优势在于:

  • 快速查找
  • 可变大小
  • 缓存友好

动态数组的工作原理

在动态数组中,元素从数组的开头连续存储,剩余空间保持未使用。我们可以添加元素,直到预留的空间被完全消耗。当预留的空间被消耗并且需要添加一些元素时。在这种情况下,需要增加固定大小的数组的大小。请注意,在追加元素之前,我们会分配一个更大的数组,将元素从原数组复制过来,然后返回新创建的数组。

添加元素的另一种方法是:首先,创建一个函数,该函数创建一个大小加倍的新数组,将所有元素从旧数组复制过来,然后返回新数组。同样,我们也可以缩小动态数组的大小。

大小与容量

动态数组的初始化会创建一个固定大小的数组。在下图的实现中,该数组有 10 个索引。我们向数组添加了五个元素。现在,底层数组的长度为五。因此,动态数组的大小为 5,容量为 10。动态数组会跟踪终点。

Dynamic Array in Java

动态数组的特性

在 Java 中,动态数组有三个关键特性:**添加元素、删除元素和调整数组大小。**

在动态数组中添加元素

在动态数组中,如果我们想在数组中添加更多元素,可以创建一个固定大小的数组。通常,它会创建一个大小加倍的新数组。之后,它会将所有元素复制到新创建的数组中。当元素添加到 ArrayList 并达到其容量时,它会自动扩展其内部数组以容纳更多元素。我们使用以下方法:

Dynamic Array in Java

从动态数组中删除元素

如果我们想从数组的指定索引处删除一个元素,我们使用 **removeAt(i)** 方法。该方法解析我们要删除的元素的索引号。删除元素后,它会将指定索引号右边的剩余元素(被删除元素右边的元素)向左移。

我们还可以使用 remove() 方法从数组末尾删除一个元素。移动元素后,它会在最后一个元素的位置存储 0。remove() 方法允许我们删除特定索引处的元素,而 remove(Object o) 方法则删除指定元素的第一个出现。让我们通过下面的例子来理解它。

Dynamic Array in Java

调整 Java 中动态数组的大小

我们需要在以下两种情况下调整数组大小:

  • 数组使用的内存超过了必需的内存。
  • 数组占用了所有内存,我们需要添加元素。

在第一种情况下,我们使用 **shrinkSize()** 方法来调整 数组 的大小。它会减小数组的大小。它会释放多余或未使用的内存。在第二种情况下,我们使用 **growSize()** 方法来调整数组的大小。它会增加数组的大小。

这是一项昂贵的操作,因为它需要一个更大的数组,并将所有元素从前一个数组复制过来,然后返回新数组。

Dynamic Array in Java

假设在上面的数组中,需要再添加六个元素,而数组中没有更多的内存空间来存储这些元素。在这种情况下,我们使用 **growSize()** 方法来增长数组。

Dynamic Array in Java

遍历 ArrayList

我们可以使用循环或 Java 中的增强 for 循环来遍历 ArrayList 的元素。以下是使用传统 for 循环遍历 ArrayList 的示例:

初始化动态数组

动态数组的初始化与静态数组相同。考虑以下初始化动态数组的 Java 程序。

InitializeDynamicArray.java

输出

Elements of Array are: 34 90 12 22 9 27

让我们在 Java 程序中实现上面讨论过的操作。

DynamicArrayExample1.java

输出

Dynamic Array in Java

让我们收缩数组,删除最后一个元素,以及数组中的特定元素。

DynamicArrayExample2.java

输出

Dynamic Array in Java