Java中List.of()和Arrays.asList()的区别及原因分析

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技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 这是我的战争前期前五天玩法介绍

    我的战争前期前五天玩法介绍 在《我的战争》游戏中,前期的五天非常关键,这里提供一些玩家可以使用的策略来存活和发展。 1. 初期资源的获取 在游戏的开始,资源非常有限,但是这并不意味着你不能快速发展。第一天,最重要的任务是保持活下来,建立一个可以保护你的基地。最好的方法是寻找资源点并获得最初的几个资源,例如金属和木材,而不是在第一天建造建筑。 2. 建立初期的…

    Java 2023年6月16日
    00
  • Springboot启动后执行方法小结

    SpringBoot启动后执行方法是开发SpringBoot应用程序时经常涉及到的一个知识点。本文将详细讲解SpringBoot启动后执行方法的完整攻略,包括执行方式、参数解析和应用场景。 一、执行方式 SpringBoot启动后执行方法有两种执行方式,分别为实现CommandLineRunner接口和使用ApplicationRunner接口。 1.1 实…

    Java 2023年5月31日
    00
  • 基于MyBatis的数据持久化框架的使用详解

    基于 MyBatis 的数据持久化框架的使用详解 什么是 MyBatis MyBatis 是一种开源的持久化框架,简单地将 SQL 语句与 Java 对象进行映射。它可以轻松地将复杂的 SQL 语句映射到可维护的 Java 对象中。 MyBatis 提供了一些内置工具和插件,可以大大简化开发人员编写持久层代码的工作。 MyBatis 的使用 在使用 MyBa…

    Java 2023年5月20日
    00
  • MyBatis5中Spring集成MyBatis事物管理

    下面是关于MyBatis5中Spring集成MyBatis事物管理的完整攻略: 1、引入依赖 首先需要在pom.xml文件中引入MyBatis和Spring的依赖,具体如下: <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</…

    Java 2023年5月20日
    00
  • Java构造方法实例详解(动力节点java学院整理)

    我来为你讲解一下Java构造方法实例的攻略。 什么是构造方法? 构造方法是Java程序中一个非常重要的组成部分,它在创建一个对象的时候被调用。构造方法的作用是初始化对象,并为对象的成员变量赋初始值。 Java的构造方法与普通方法有很大的区别,主要表现在以下几个方面: 构造方法的方法名必须与类名相同,且没有返回值类型(包括void),不需要使用return语句…

    Java 2023年5月20日
    00
  • hibernate-validator改进校验框架validator v0.4使用

    来讲一下“hibernate-validator改进校验框架validator v0.4使用”的完整攻略。 什么是Hibernate-Validator? Hibernate-Validator 是一款校验框架。这个框架的初衷是为了在 JavaBean 层面上提供一套统一、可重用的验证机制,使得我们在对 JavaBean 进行数据验证时能够更加方便、快捷、灵…

    Java 2023年5月20日
    00
  • Nginx的伪静态配置中使用rewrite来实现自动补全的实例

    以下是详细的攻略: 什么是Nginx伪静态配置? Nginx伪静态配置又叫做URL重写,可以通过对URL的转换来实现对客户端的透明隐藏,防止暴露后端服务器的真实地址。通常情况下,我们使用rewrite指令来实现伪静态配置。 如何使用rewrite实现URL自动补全? 对于URL自动补全实现,我们可以使用rewrite来将用户输入的不完整URL进行自动补全,以…

    Java 2023年6月15日
    00
  • CentOS7和8中安装Maven3.8.4的简单步骤

    下面我为你详细讲解 “CentOS7和8中安装Maven3.8.4的简单步骤”的完整攻略。 安装Java环境 在安装Maven之前,需要先在服务器上安装Java环境,否则Maven将无法正常使用。 # 在终端输入以下命令进行Java环境的安装 yum install java-1.8.0-openjdk-devel -y 安装完成后,检查Java环境是否正常…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部