Dynamic Array in Java2025年3月26日 | 阅读 9 分钟 数组是一种固定大小的同构数据结构。数组的局限性在于其大小固定。这意味着我们在声明数组时必须指定元素的数量。此时会产生一个问题:如果我们想插入一个元素,但没有更多的空间来容纳新元素怎么办? 这时,**动态数组**的概念就应运而生了。它动态地扩展数组的大小。动态数组,在 Java 中也称为 ArrayList,是基本的数据结构,它提供了一种灵活的方式来存储和操作元素集合。 什么是动态数组?动态数组是一种**可变大小**的列表数据结构。当我们尝试插入元素而没有更多空间时,它会自动增长。它允许我们添加和删除元素。它在运行时使用堆分配内存。它可以在运行时更改其大小。 在 Java 中,ArrayList 是一个可调整大小的实现。它实现了 List 接口,并提供了所有与列表操作相关的 ArrayList 方法。与传统数组相比,ArrayList 具有许多优点,例如自动调整大小、易于使用以及与泛型类型的兼容性。动态数组的优势在于:
动态数组的工作原理在动态数组中,元素从数组的开头连续存储,剩余空间保持未使用。我们可以添加元素,直到预留的空间被完全消耗。当预留的空间被消耗并且需要添加一些元素时。在这种情况下,需要增加固定大小的数组的大小。请注意,在追加元素之前,我们会分配一个更大的数组,将元素从原数组复制过来,然后返回新创建的数组。 添加元素的另一种方法是:首先,创建一个函数,该函数创建一个大小加倍的新数组,将所有元素从旧数组复制过来,然后返回新数组。同样,我们也可以缩小动态数组的大小。 大小与容量动态数组的初始化会创建一个固定大小的数组。在下图的实现中,该数组有 10 个索引。我们向数组添加了五个元素。现在,底层数组的长度为五。因此,动态数组的大小为 5,容量为 10。动态数组会跟踪终点。 ![]() 动态数组的特性在 Java 中,动态数组有三个关键特性:**添加元素、删除元素和调整数组大小。** 在动态数组中添加元素在动态数组中,如果我们想在数组中添加更多元素,可以创建一个固定大小的数组。通常,它会创建一个大小加倍的新数组。之后,它会将所有元素复制到新创建的数组中。当元素添加到 ArrayList 并达到其容量时,它会自动扩展其内部数组以容纳更多元素。我们使用以下方法: ![]() 从动态数组中删除元素如果我们想从数组的指定索引处删除一个元素,我们使用 **removeAt(i)** 方法。该方法解析我们要删除的元素的索引号。删除元素后,它会将指定索引号右边的剩余元素(被删除元素右边的元素)向左移。 我们还可以使用 remove() 方法从数组末尾删除一个元素。移动元素后,它会在最后一个元素的位置存储 0。remove() 方法允许我们删除特定索引处的元素,而 remove(Object o) 方法则删除指定元素的第一个出现。让我们通过下面的例子来理解它。 ![]() 调整 Java 中动态数组的大小我们需要在以下两种情况下调整数组大小:
在第一种情况下,我们使用 **shrinkSize()** 方法来调整 数组 的大小。它会减小数组的大小。它会释放多余或未使用的内存。在第二种情况下,我们使用 **growSize()** 方法来调整数组的大小。它会增加数组的大小。 这是一项昂贵的操作,因为它需要一个更大的数组,并将所有元素从前一个数组复制过来,然后返回新数组。 ![]() 假设在上面的数组中,需要再添加六个元素,而数组中没有更多的内存空间来存储这些元素。在这种情况下,我们使用 **growSize()** 方法来增长数组。 ![]() 遍历 ArrayList我们可以使用循环或 Java 中的增强 for 循环来遍历 ArrayList 的元素。以下是使用传统 for 循环遍历 ArrayList 的示例: 初始化动态数组动态数组的初始化与静态数组相同。考虑以下初始化动态数组的 Java 程序。 InitializeDynamicArray.java 输出 Elements of Array are: 34 90 12 22 9 27 让我们在 Java 程序中实现上面讨论过的操作。 DynamicArrayExample1.java 输出 ![]() 让我们收缩数组,删除最后一个元素,以及数组中的特定元素。 DynamicArrayExample2.java 输出 ![]() |
Java 是一种流行的编程语言,以其灵活性、可靠性和安全性而闻名。使其成为一种通用语言的关键特性之一是其对泛型的支持。Java 中的泛型提供了一种创建类型安全类、方法和接口的方式,这些类、方法和接口可以工作...
阅读 3 分钟
当创建的对象无法更改时,Java 类就被认为具有不可变状态。对象的创建完成后,其状态永远不会改变。非共享的可变对象始终是线程安全的,这些对象是...
阅读 4 分钟
给定一个包含整数的数组。还给定一个整数 k。我们的任务是找到一个数组,该数组由最小范围 [lft, rght](包括 lft 和 rght)组成,使得该数组中恰好有 k 个不同的数字...
阅读 8 分钟
魔方是由数字组成的方格。n 阶魔方包含从 1 到 m2(含 1 和 m2)的数字,使得行中所有数字的总和等于...
阅读 6 分钟
Java 中的不可达代码或语句是 Java 初学者常见的问题。这是一种编译时错误。许多新手开发者将此错误与死代码(另一种 Java 相关现象)混淆。尽管两者在表现上相似,但两者之间存在细微差别...
阅读 4 分钟
在面向对象编程中,封装是一个基本概念,它指的是隐藏对象的实现细节并提供访问其属性和行为的接口。访问器和修改器方法是与 Java 中的封装相关的两个重要概念。访问器访问器方法,也称为...
阅读 4 分钟
区块链是一项新兴技术,在未来几年将具有巨大的前景。在本教程中,我们将简要介绍区块链的基本概念。我们还将创建一个基本的区块链程序(用 Java 编写),以了解它在编程世界中的工作原理。什么是区块链?区块链是...
阅读 8 分钟
两个重要的Java类-Socket和ServerSocket-在创建网络应用程序时具有不同的功能。这些类具有独特的功能,是客户端-服务器架构的重要组成部分。在本节中,我们将讨论Socket和ServerSocket之间的区别,以及它们独特的功能和...
阅读 3 分钟
? Java 多线程允许程序中多个线程的并发操作。但是,当多个线程使用相同资源时,可能会出现数据不一致和种族状况等问题。Java 提供了同步技术来解决这些问题。Synchronized Keyword Java 同步的关键组成部分是 synchronized……
阅读 6 分钟
Java.util.concurrent 包中 LinkedTransferQueue 类的 retainAll() 函数用于仅保留队列中属于指定集合的元素。如果您有两个集合,只想保留共享的元素,此方法特别有用...
11 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India