List.of 和 Arrays.asList 方法之间存在一些关键差异,这些差异可能会导致代码中出现意外错误。
作为 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
对比总结
使用场景
在以下情况下使用 Arrays.asList
- 您需要一个由数组支持的固定大小的列表。
- 您可能需要修改现有元素。
- 您需要在列表中
使用 null
元素。 - 您希望列表中的更改反映在原始数组中。
在以下情况下使用 List.of
- 您需要一个不可变列表。
- 您希望阻止对列表进行修改。
- 您不需要
null
元素。 - 您正在处理不可修改的数据集。
另外,了解这些有助于您做出明智的决策:
- 性能:由于线程安全和减少了对防御性复制的需求,不可变列表的性能可能更高。
- 安全:防止意外修改,尤其是在多线程环境中。
- 清晰:明确声明不可变性的代码更容易推理和维护。
总结
在 Arrays.asList()
和 List.of()
之间进行选择不仅仅是语法问题,而是针对您的特定需求选择正确的工具。通过了解它们在可变性、空处理以及它们如何与数组交互方面的差异,您可以编写更健壮且无错误的代码。下次在 Java 中将数组转换为列表时,请牢记这些细微差别。
没有回复内容