Java中List.of()和Arrays.asList()的区别及原因分析
背景
在Java中,我们经常需要使用List集合来存储一组数据,如何高效地初始化一个List是我们需要关注的问题。在Java 9及其后续版本中,引入了List.of()
方法,提供了一种更简单、更易读的方式来初始化List集合。但是,在Java 9之前,我们经常使用Arrays.asList()
方法来初始化List集合。那么,List.of()
和Arrays.asList()
有什么区别呢?这个问题在面试中也经常被问到。下面将详细比较这两个方法的区别及原因分析。
区别
1. 可变性
List.of()
方法返回的List集合是不可变的,不能添加、删除或修改其中的元素。如果我们想对其中的元素进行操作,将会抛出UnsupportedOperationException
异常。而Arrays.asList()
方法返回的List集合是可变的,可以添加、删除或修改其中的元素。
示例代码:
List<Integer> list1 = List.of(1, 2, 3);
list1.add(4); //抛出UnsupportedOperationException异常
list1.set(0, 5); //抛出UnsupportedOperationException异常
List<Integer> list2 = Arrays.asList(1, 2, 3);
list2.add(4); //不抛出异常
list2.set(0, 5); //修改成功
2. 元素类型
List.of()
方法返回的List集合中的元素类型是不可变的,我们必须在调用该方法时就确定元素的类型。而Arrays.asList()
方法返回的List集合中的元素类型是可变的,我们可以在运行时改变元素的实际类型。
示例代码:
List<Number> list1 = List.of(1, 2.0, 3L);
List<Integer> list2 = Arrays.asList(1, 2, 3);
Collections.addAll(list1, 4.0f, 5L); //抛出UnsupportedOperationException异常
Collections.addAll(list2, 4, 5L); //添加成功
原因分析
为什么List.of()
方法返回的List集合是不可变的?为什么Arrays.asList()
方法返回的List集合是可变的?
1. List.of()方法原因分析
List.of()
方法返回的List集合是被视为不可变的,这个决策是由Java语言设计者做出的。不可变的对象是线程安全的,可以有效地避免在并发环境下出现竞态条件。在Java 9中, Lambda表达式 和 Stream API 的使用比以往更加地广泛,因此Java在集合方面的使用也越来越频繁。List.of()
方法不可变性的设计可以避免线程间的竞争,更符合函数式编程的思想。
2. Arrays.asList()方法原因分析
Arrays.asList()
方法返回的List集合是可变的,是由它的实现方式决定的。Arrays.asList()
方法实际上是将数组转换成列表返回,因此随后对该列表的操作都可以直接地映射到原数组上。这样,我们就可以实现在不创建新对象的情况下,修改一个已经创建的数组。
但是需要注意的是,如果我们修改了Arrays.asList()
返回的List集合中的元素个数,那么这样的操作可能会导致程序运行时出现一些意料之外的问题(如示例代码中,我们添加了一个元素4后,却没有抛出异常,但是在调用toArray()
方法时却出现了ArrayStoreException
异常)。
总结
List.of()
和Arrays.asList()
都是Java中常用的初始化List集合的方法,这两个方法有着不同的特点和应用场景。List.of()
方法的不可变性特性更符合函数式编程的思想,可避免在并发环境下出现竞态条件;而Arrays.asList()
方法的可变性特性则可以高效地对已有的数组对象进行修改。我们可以在实际工作中根据需要来选择不同的方法来初始化List集合。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中List.of()和Arrays.asList()的区别及原因分析 - Python技术站