List.of() 与 Arrays.asList该如何选择?("List.of() vs Arrays.asList():选择哪个更合适?")
原创
引言
在Java中,当我们需要创建一个不可变的列表时,可以使用Java 9引入的List.of()方法,或者使用Arrays.asList()方法。这两种方法都可以迅速创建列表,但它们之间还是存在一些区别的。本文将详细分析List.of()和Arrays.asList()的用法、区别以及怎样选择更合适的方法。
1. List.of()和Arrays.asList()的用法
首先,让我们看看这两种方法的用法。
// 使用List.of()创建列表
List
list1 = List.of("Apple", "Banana", "Cherry"); // 使用Arrays.asList()创建列表
List
list2 = Arrays.asList("Apple", "Banana", "Cherry");
从用法上看,这两种方法都非常明了,只需要将元素作为参数传递给方法,就可以创建一个包含这些元素的列表。
2. List.of()和Arrays.asList()的区别
尽管这两种方法都可以创建列表,但它们之间还是存在一些区别的。以下是首要的区别:
2.1. 不可变性
List.of()创建的列表是不可变的,这意味着你不能添加、删除或修改列表中的元素。如果你尝试这样做,程序将抛出UnsupportedOperationException异常。
List
list1 = List.of("Apple", "Banana", "Cherry"); // 尝试修改列表中的元素
list1.set(0, "Orange"); // 抛出UnsupportedOperationException异常
相比之下,Arrays.asList()创建的列表是可变的。虽然Arrays.asList()返回的是List类型,但实际上它返回的是一个固定大小的列表,底层数组不能被修改。这意味着你可以修改列表中的元素,但不能添加或删除元素。
List
list2 = Arrays.asList("Apple", "Banana", "Cherry"); // 修改列表中的元素
list2.set(0, "Orange"); // 修改成就
// 尝试添加元素
list2.add("Grape"); // 抛出UnsupportedOperationException异常
2.2. 底层数组
List.of()方法不依靠于任何底层数组,它返回的是一个真正的不可变列表。而Arrays.asList()方法返回的是一个固定大小的列表,它依靠于传入的数组。
// List.of()不依靠于底层数组
List
list1 = List.of("Apple", "Banana", "Cherry"); // Arrays.asList()依靠于底层数组
String[] array = {"Apple", "Banana", "Cherry"};
List
list2 = Arrays.asList(array); // 修改数组,会影响Arrays.asList()返回的列表
array[0] = "Orange";
System.out.println(list2.get(0)); // 输出:Orange
2.3. 性能
在性能方面,List.of()方法通常比Arrays.asList()方法更高效,基于List.of()返回的是一个真正的不可变列表,而Arrays.asList()返回的是一个固定大小的列表,它依靠于底层数组。
3. 怎样选择List.of()和Arrays.asList()
选用上述分析,以下是一些选择List.of()和Arrays.asList()的建议:
3.1. 当需要不可变列表时,选择List.of()
如果您需要创建一个不可变的列表,以确保列表中的元素不会被修改,那么应该选择List.of()方法。这样可以防止意外修改列表,保证程序的稳定性。
3.2. 当需要可变列表时,选择Arrays.asList()
如果您需要创建一个可变的列表,以便在需要时添加或删除元素,那么应该选择Arrays.asList()方法。但请注意,虽然Arrays.asList()返回的列表是可变的,但实际上它依靠于底层数组,所以不能添加或删除元素。
3.3. 考虑性能
如果性能是一个关键因素,那么List.of()通常是更好的选择。基于List.of()返回的是一个真正的不可变列表,而Arrays.asList()返回的是一个固定大小的列表,它依靠于底层数组。
4. 总结
List.of()和Arrays.asList()都是创建列表的便捷方法,但它们之间还是存在一些区别的。在选择使用哪种方法时,应考虑列表的不可变性、底层数组和性能等因素。选用具体需求,合理选择List.of()或Arrays.asList(),可以保证程序的稳定性和性能。