List.of 与 Arrays.asList 的细微差别和最佳实践-Java专区论坛-技术-SpringForAll社区

List.of 与 Arrays.asList 的细微差别和最佳实践

List.of 和  Arrays.asList 方法之间存在一些关键差异,这些差异可能会导致代码中出现意外错误。

d2b5ca33bd20241024095630

作为 Java 开发人员,您可能已经使用 Arrays.asList() 将数组快速转换为列表。随着 Java 9 中 List.of() 的引入,创建列表的新播放器即将到来。乍一看,它们似乎可以互换,但在后台,它们具有显著差异,可能会导致意外行为,甚至导致代码崩溃。让我们深入研究这两种方法,以了解它们的细微差别以及它们如何影响您的 Java 集合。

Arrays.asList

Arrays.asList() 方法是 java.util.Arrays 类提供的实用程序。它将数组转换为由原始数组支持的固定大小列表。

使用案例:

String[] fruitsArray = {"Apple", "Banana", "Cherry"};
List<String> fruitsList = Arrays.asList(fruitsArray);

关键特性

  • 固定大小列表:该列表具有固定大小。您无法添加或删除元素,但可以修改现有元素。
  • 由数组支持:对列表的更改将反映在数组中,反之亦然
  • 允许 null 元素:列表中可以有 null 值。

潜在问题

尝试添加或删除元素可能引发 UnsupportedOperationException

fruitsList.add("Date"); // Throws UnsupportedOperationException
fruitsList.remove("Banana"); // Throws UnsupportedOperationException

允许修改元素,并影响原始数组:

fruitsList.set(0, "Apricot");
System.out.println(fruitsArray[0]); // Output: Apricot

List.of

在 Java 9 中引入的 List.of() 是一个静态工厂方法,用于创建不可变列表。

使用案例:

List<String> fruitsList = List.of("Apple", "Banana", "Cherry");

关键特性

  • 不可变列表:该列表不可修改。任何更改它的尝试都将导致异常。
  • 不受数组支持:这是一个独立的列表;更改不会影响任何底层数组。
  • 不允许 null 元素:插入 null 会引发 NullPointerException

潜在问题

任何修改尝试都将引发 UnsupportedOperationException

fruitsList.add("Date"); // Throws UnsupportedOperationException
fruitsList.set(0, "Apricot"); // Throws UnsupportedOperationException

尝试包含 null 元素:

List<String> fruitsList = List.of("Apple", null, "Cherry"); // Throws NullPointerException

对比总结

d2b5ca33bd20241024100541

使用场景

在以下情况下使用 Arrays.asList

  • 您需要一个由数组支持的固定大小的列表。
  • 您可能需要修改现有元素。
  • 您需要在列表中使用 null 元素。
  • 您希望列表中的更改反映在原始数组中。

在以下情况下使用 List.of

  • 您需要一个不可变列表。
  • 您希望阻止对列表进行修改。
  • 您不需要 null 元素。
  • 您正在处理不可修改的数据集。

另外,了解这些有助于您做出明智的决策:

  • 性能:由于线程安全和减少了对防御性复制的需求,不可变列表的性能可能更高。
  • 安全:防止意外修改,尤其是在多线程环境中。
  • 清晰:明确声明不可变性的代码更容易推理和维护。

总结

在 Arrays.asList() 和 List.of() 之间进行选择不仅仅是语法问题,而是针对您的特定需求选择正确的工具。通过了解它们在可变性、空处理以及它们如何与数组交互方面的差异,您可以编写更健壮且无错误的代码。下次在 Java 中将数组转换为列表时,请牢记这些细微差别。

请登录后发表评论

    没有回复内容