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日

相关文章

  • .htaccess文件使用教程总结

    下面是“.htaccess文件使用教程总结”的详细攻略: 什么是.htaccess文件 .htaccess文件是一种在Apache Web服务器上配置Web服务器的文件,可以让您定义许多方面的服务器行为和规则。 创建.htaccess文件 在创建.htaccess文件之前,您需要确保您的服务器上启用了.htaccess文件。在Apache服务器中,默认情况下…

    Java 2023年6月15日
    00
  • Spring security 如何开放 Swagger 访问权限

    我们需要完成以下步骤来开放Swagger访问权限:1. 添加Swagger API依赖。2. 添加Swagger配置类。3. 配置Spring Security以允许Swagger接口访问。 1. 添加Swagger API依赖 <dependency> <groupId>io.springfox</groupId> &l…

    Java 2023年5月20日
    00
  • Java8中字符串处理库strman-java的使用示例

    针对Java8中字符串处理库strman-java的使用示例,我可以提供以下完整攻略: 一、什么是strman-java strman-java是一个Java8中的字符串处理库,该库提供了各种字符串处理方法,例如字符串分割、替换、格式化、加密、解码等。同时,该库支持链式调用,可用于流畅地处理字符串,方便简洁。strman-java库基于Node.js中的un…

    Java 2023年5月27日
    00
  • 图解Spring框架的设计理念与设计模式

    图解Spring框架的设计理念与设计模式 Spring框架是Java生态中最受欢迎的开源框架之一,它利用了许多常用的设计模式和技术,用以实现IoC和AOP等特性,在Java应用程序的开发中扮演着重要的角色。 Spring框架的设计理念 Spring框架的设计理念可以用”POJO”(Plain Old Java Object)来概括,它鼓励开发者使用简单的Ja…

    Java 2023年5月19日
    00
  • SpringBoot项目访问任意接口出现401错误的解决方案

    当我们使用SpringBoot项目访问任意接口时出现401错误,可能是因为项目的权限配置问题导致的。下面是解决它的完整攻略: 1.检查接口权限 首先我们需要检查接口权限,确定是否已经在项目中配置了相应的权限。我们可以通过查看Spring Security配置文件(一般为SecurityConfig.java)的代码或者在SpringBoot Admin管理后…

    Java 2023年5月20日
    00
  • Java实现储存对象并按对象某属性排序的几种方法示例

    让我们来详细讲解一下Java实现储存对象并按对象某属性排序的几种方法示例。 1.使用Comparable接口进行排序 实现Comparable接口 我们可以在对象类中实现Comparable接口,覆盖其compareTo方法,来实现按照某个属性进行排序。如下所示: public class Student implements Comparable<S…

    Java 2023年5月26日
    00
  • Spring中校验器(Validator)的深入讲解

    下面是Spring中校验器(Validator)的深入讲解的完整攻略: 什么是校验器? 校验器是Spring框架中用于对入参进行校验的机制,也是一种对提交表单或者JSON数据做前端校验的技术。 校验器的作用 校验器能够帮助我们对参数进行格式和业务上的校验,避免一些无效的操作,提高了操作的正确性和安全性。 校验器的使用 1. 自定义校验器 使用校验器需要按照S…

    Java 2023年5月19日
    00
  • 全面解析Java支持的数据类型及Java的常量和变量类型

    全面解析Java支持的数据类型及Java的常量和变量类型 Java支持的基本数据类型 Java支持八种基本数据类型,分别是:byte、short、int、long、float、double、char和boolean。具体说明如下: byte:8位有符号整数类型。用于节省内存,适合于低级数据。 short:16位有符号整数类型。和byte类似,被用于节省空间。…

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