Java 中的 ArrayList 和 LinkedList 有什么区别?

java 8object oriented programmingprogramming

Java 开发人员经常使用数据结构 ArrayList 和 LinkedList 来存储和处理数据集合。由于它们在底层实现和性能特征上的差异,它们更适合某些用例。在本教程中,我们将研究 ArrayList 和 LinkedList 的性能、内存要求和使用情况以及它们之间的差异。在本教程结束时,您将更好地了解在 Java 项目中何时使用 ArrayList 以及何时使用 LinkedList。

Java 中的 Arraylist

在 Java 中,ArrayList 是一种动态数组数据结构,使用户能够以列表式样式存储和操作元素。对于某些应用程序来说,ArrayList 比标准数组更具适应性和通用性,因为它的大小可以实时更改。

任何数据类型,包括整数和双精度等简单数据类型以及对象等更复杂的数据类型,都可以在 ArrayList 中拥有元素。与普通数组类似,ArrayList 的元素可以使用索引访问,但 ArrayList 类提供了用于添加、删除和修改列表元素的其他方法。

使用 ArrayList 的优势

以下是在 Java 中使用 ArrayList 的优势:

  • 动态调整大小:ArrayList 与常规数组不同,可以在运行时动态调整大小,允许您根据需要添加或删除元素。

  • 灵活:ArrayList 比数组更具适应性,因为它们可以包含任何数据类型的元素,包括对象。

  • 易于使用:ArrayList 带有许多内置方法,可用于添加、删除和更改列表中的成员,使其易于使用使用。

  • 快速访问:ArrayLists 与传统数组一样,允许通过索引快速随机访问列表元素。

使用 ArrayList 的缺点

以下是在 Java 中使用 ArrayList 的缺点:

  • 性能受损:在数组列表中间添加或删除成员会使使用 arraylist 比使用传统数组更慢。

  • 内存使用量增加:由于其动态调整大小和额外的内部数据结构,ArrayLists 比普通数组使用更多的内存。

  • 类型安全:由于 ArrayLists 不提供编译时类型安全,因此可以向列表中添加元素类型不正确。

  • 缺乏定义的大小:ArrayLists 与传统数组不同,缺乏固定的大小,因此可能会错误地添加过多元素并耗尽内存。

Java 中的 LinkedList

LinkedList 是计算机科学中使用的一种数据结构,它组织组件列表(称为节点),以便每个节点指向其后的节点。与 ArrayList 不同,LinkedList 不会为其每个元素分配连续的内存块。相反,LinkedList 中的每个节点都会存储一个包含对列表中后续节点的引用的对象。

LinkedList 的初始节点和最后一个节点分别称为头节点和尾节点。每个节点中都存在 data 字段(用于保存元素的值)和 next 字段(用于存储列表中其后节点的引用)。

堆栈、队列和图形只是使用链表可以实现的众多数据结构的几个示例。它们比数组更具适应性,因为它们可用于有效地从列表的开头、中间或结尾添加或删除成员。但是,由于必须从列表的开头到所需元素按顺序访问每个成员,因此对于随机访问操作,链表可能比数组慢。

在 Java 中使用 LinkedList 的优势

以下是在 Java 中使用 LinkedList 的优势:

  • 动态调整大小:与 ArrayList 类似,LinkedList 允许动态运行时调整大小,允许您根据需要添加或删除组件。

  • 有效的插入和删除:在列表的开头或结尾添加或删除成员时,链表提供快速的插入和删除操作。

  • 易于实现:与树和图等其他数据结构相比,LinkedList 相对简单实现。

  • 节省内存:与 ArrayList 不同,LinkedList 不需要连续的内存分配,在某些情况下,这可能会使它们更节省内存。

在 Java 中使用 LinkedList 的缺点

以下是在 Java 中使用 LinkedList 的缺点:

  • 随机访问速度慢:对于随机访问操作,链表可能比数组慢,因为必须按顺序从列表的开头遍历每个元素到所需元素。

  • 更多内存开销:由于每个节点都需要对下一个节点的单独引用,因此链表比数组使用更多内存来存储相同数量的元素。

  • 没有内置排序: 由于 LinkedLists 缺乏像 ArrayLists 那样的内置排序功能,因此对列表元素进行排序可能更具挑战性。

ArrayList 与 LinkedList 的示例

以下示例演示了 Java 中 ArrayList 与 LinkedList 的不同之处:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class JavaTester {
   public static void main(String args[]) {
      List list = new ArrayList<>();
      list.add("A");
      list.add("B");
      list.add("C");
      list.add("D");
      List list1 = new LinkedList<>();
      list1.add("A");
      list1.add("B");
      list1.add("C");
      list1.add("D");
      System.out.println(list);
      System.out.println(list1);
   }
}

输出

它将产生以下输出

Note: JavaTester.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
[A, B, C, D]
[A, B, C, D]

Java 中的 ArrayList 与 LinkedList

下表重点介绍了 Java 中 ArrayList 和 LinkedList 之间的主要区别:

ArrayList

LinkedList

ArrayList 内部将元素保存在动态数组中。

在内部,LinkedList 将元素存储在双向链接列表中。

由于 ArrayList 在内部使用数组,因此对其进行操作会比较缓慢。如果从数组中删除任何元素,则数组中所有剩余元素都会在内存中移位。

由于使用了双向链表,无需进行内存位移,因此使用 LinkedList 进行操作比 ArrayList 更快。

由于它仅实现 List,因此 ArrayList 类只能用作列表。

由于它实现了 List 和 Deque 接口,因此 LinkedList 类可以同时用作列表和队列。

使用 LinkedList 可以更好地进行数据操作。

ArrayList 元素的内存位置是连续的。

链接列表的组件在位置方面不具有传染性。

通常,在建立数组列表时,会为其指定 10 的默认容量。

对于链接列表,没有默认容量之类的东西。初始化 LinkedList 时,会生成一个空列表。

确切地说,ArrayList 是一个可调整大小的数组。

列表接口的双向链接列表由 LinkedList 实现。

结论

总之,流行的 Java 数据结构 ArrayList 和 LinkedList 各有其特定的优缺点。在需要快速访问项目且元素不经常添加或删除的情况下,您更愿意使用 ArrayList。另一方面,当组件的顺序至关重要并且需要频繁添加或删除元素时,LinkedList 是最佳选择。

为了实现最佳性能,选择适合您独特用例的正确数据结构至关重要。通过理解 ArrayList 和 LinkedList 之间的差异,您可以做出明智的选择并创建有效的程序。


相关文章