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日

相关文章

  • Spring Boot Mysql 数据库操作示例

    Spring Boot Mysql 数据库操作示例 1. 简介 Spring Boot是一个快速构建Spring应用程序的框架。它针对Spring框架进行了封装和简化,让开发人员能够快速地搭建Spring应用程序,同时也提供了丰富的可插拔的第三方插件,方便开发者快速开发。Mysql则是一种轻量级的关系型数据库,它具有开源、易用、可定制化等优势,在Web项目的…

    Java 2023年6月1日
    00
  • 详谈Java中net.sf.json包关于JSON与对象互转的坑

    讲解“详谈Java中net.sf.json包关于JSON与对象互转的坑”的完整攻略: 背景 JSON是一种轻量级的数据交换格式,以其简洁、易读、易解析的特点被广泛应用。而在Java中,开发者可使用net.sf.json包来轻松实现JSON与对象之间的互转。但在使用过程中,开发者需要注意一些注意事项,否则就会掉入JSON与对象互转的“坑”中。 坑点一:JSON…

    Java 2023年5月26日
    00
  • JAVA文件读写操作详解

    JAVA文件读写操作详解 什么是文件读写操作 文件读写操作是指对于指定的文件,通过程序的方式读取其中的数据或者将程序中的数据写入到文件中。文件读写操作是一个底层的技术,基本上所有的软件开发都会用到这个技术。 JAVA文件读写操作的常用类 在JAVA中,文件读写操作主要涉及到以下几个类: File类:代表文件和目录的抽象表示。通过对File类的操作,可以创建、…

    Java 2023年5月20日
    00
  • Spring Boot 如何自定义返回错误码错误信息

    一、背景知识 在开发过程中,定义一套统一的错误码以及错误信息对于后续的使用和协作有很大的帮助,这笔帮助在项目人员的交流、定位问题、维护代码等方面会发挥至关重要的作用。 Spring Boot 是一个优秀的开源框架,同样也提供了很多途径来自定义错误码以及错误信息,因此本文打算讲解一下如何在 Spring Boot 中自定义返回错误码和错误消息的过程。 二、应用…

    Java 2023年5月27日
    00
  • Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法

    下面是详细讲解“Eclipse下编写java程序突然不会自动生成R.java文件和包的解决办法”的完整攻略。 问题描述 在使用Eclipse编写Java程序时,可能会遇到不会自动生成R.java文件和包的情况,这会导致在项目中使用资源文件时出现问题。 解决步骤 步骤一:检查项目配置 首先,需要检查项目的配置是否正确。可以按照以下步骤操作: 在Eclipse中…

    Java 2023年5月26日
    00
  • JAVA Future类的使用详解

    JAVA Future类的使用详解 什么是Future类? Java中的Future类用于描述一个异步计算的结果,它提供了检查计算是否完成、等待计算完成和获取计算结果的方法。 Future类的使用方法 创建Future对象 可以使用java.util.concurrent.Executors类中的线程池工厂方法创建一个ExecutorService线程池,然…

    Java 2023年5月26日
    00
  • MATLAB算法技巧和实现斐波那契数列的解决思路

    MATLAB算法技巧和实现斐波那契数列的解决思路 概述 MATLAB是一款广泛使用的科学计算软件,其中涉及的算法技巧和实现方法是使用MATLAB进行数据分析和模拟的重点内容之一。这篇文章主要介绍MATLAB中应用于算法优化和实现的技巧和思路,并且使用其中的技巧和思路实现斐波那契数列。 MATLAB算法优化技巧 MATLAB中涉及的算法可以通过一些技巧和方法进…

    Java 2023年5月19日
    00
  • java怎么连接并访问activemq

    要连接并访问ActiveMQ,需要经历以下几个步骤: 获取ActiveMQ连接工厂对象 创建连接对象 创建会话对象 创建消息对象 发送或接收消息 以下是Java连接并访问ActiveMQ的完整攻略: 1. 引入依赖 首先,需要引入ActiveMQ的依赖包。可以在项目的pom.xml中添加以下代码: <dependency> <groupId…

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