List.of() 与 Arrays.asList()总结

List.of() 与 Arrays.asList() 是 Java 中用于创建列表的两种不同方法。虽然它们都用于创建包含一组元素的列表对象,但它们在实现、不可变性、适用场景和一些细节上存在重要差异。本文将详细分析这两种方法,讨论它们的异同点以及在什么情况下使用它们。

List.of()

List.of() 是 Java 9 引入的一个新方法,它属于 Java 集合框架的一部分,用于创建不可变(immutable)的列表对象。它接受可变数量的参数,返回一个包含这些参数的不可变列表。以下是 List.of() 的一些关键特点:

不可变性

List.of() 创建的列表是不可变的,这意味着一旦创建,就不能再添加、删除或修改其中的元素。这是通过使列表的方法抛出 UnsupportedOperationException 异常来实现的。不可变性在多线程环境下非常有用,因为它可以避免并发访问问题。

可变参数

List.of() 接受可变数量的参数,这意味着你可以将任意数量的元素传递给它,并且它会将这些元素包含在返回的列表中。这是一个非常方便的功能,因为你不需要创建数组或手动添加元素。

List<String> colors = List.of("Red", "Green", "Blue");

长度固定

List.of() 创建的列表是固定长度的,即无法添加或删除元素。这意味着你不能使用 add()remove() 方法来修改列表。如果尝试这样做,会抛出 UnsupportedOperationException 异常。

不允许空元素

List.of() 不允许添加空元素(null)。如果尝试将空元素传递给它,会抛出 NullPointerException 异常。

线程安全

由于 List.of() 创建的列表是不可变的,它们在多线程环境中是线程安全的。这意味着多个线程可以同时读取这些列表而不会引发并发问题。

具有泛型支持

List.of() 支持泛型,因此你可以创建包含特定类型元素的列表。例如,List.of(1, 2, 3) 将创建一个 List<Integer>

返回类型

List.of() 返回的类型是 List 接口的一个实现,但它不是 ArrayList 或其他特定的列表类型。这是因为 List.of() 创建的列表是不可变的,没有可变长度或容量。

List<String> colors = List.of("Red", "Green", "Blue");

Arrays.asList()

Arrays.asList() 是 Java 1.2 引入的方法,用于将数组转换为列表。它接受一个数组作为参数,返回一个包装数组的列表。以下是 Arrays.asList() 的一些关键特点:

基于数组

Arrays.asList() 是基于数组的,它将现有数组包装为一个列表。这意味着它的底层数据结构仍然是数组,因此它具有数组的一些特性,如固定长度。

String[] colorsArray = {"Red", "Green", "Blue"};
List<String> colorsList = Arrays.asList(colorsArray);

可变性

Arrays.asList() 创建的列表是可变的,这意味着你可以使用 add()remove() 方法来修改列表中的元素。但需要注意的是,如果尝试调用 add()remove() 来更改数组大小,会引发 UnsupportedOperationException 异常,因为底层数组的大小是不可变的。

与底层数组的关联

Arrays.asList() 返回的列表与原始数组关联,这意味着对列表的更改也会反映在原始数组中。例如,如果你修改列表中的元素,原始数组也会被修改。

String[] colorsArray = {"Red", "Green", "Blue"};
List<String> colorsList = Arrays.asList(colorsArray);colorsList.set(0, "Yellow"); // 修改列表
System.out.println(Arrays.toString(colorsArray)); // 打印原始数组

允许空元素

List.of() 不同,Arrays.asList() 允许添加空元素(null)。这是因为它仅是将现有数组包装为列表,而不会在添加元素时执行额外的检查。

List<String> listWithNull = Arrays.asList("Red", null, "Blue");

返回类型

Arrays.asList() 返回的类型是 List 接口的一个实现,但它的具体实现类是 ArrayList。这是因为它是基于数组的,但也提供了列表接口的功能。        

String[] colorsArray = {"Red", "Green", "Blue"};
List<String> colorsList = Arrays.asList(colorsArray);

List.of() 与 Arrays.asList() 的比较

现在,让我们比较一下这两种方法,分析它们的异同点以及在何种情况下使用哪个方法。

不可变性 vs 可变性

  • List.of() 创建的列表是不可变的,而 Arrays.asList() 创建的列表是可变的。如果你需要一个不可变的列表,以避免数据被修改,可以使用 List.of()
  • 如果你需要一个可变的列表,以便添加、删除或修改元素,可以使用 Arrays.asList()

可变参数 vs 数组

  • List.of() 接受可变数量的参数,不需要手动创建数组。这使得创建列表更加方便。
  • Arrays.asList() 需要传递一个现有的数组作为参数。如果你已经有一个数组并希望将其转换为列表,可以使用

Arrays.asList()

固定长度 vs 关联数组

  • List.of() 创建的列表是固定长度的,无法添加或删除元素。这可以帮助确保数据的不可变性。
  • Arrays.asList() 创建的列表可以添加或删除元素,但底层数组的大小是不可变的。它与底层数组关联,因此对列表的更改会影响原始数组。

允许空元素 vs 不允许空元素

  • List.of() 不允许添加空元素,如果传递 null,会抛出异常。
  • Arrays.asList() 允许添加空元素,不会执行额外的检查。

线程安全性

  • 由于 List.of() 创建的列表是不可变的,它们在多线程环境中是线程安全的。
  • Arrays.asList() 创建的列表是可变的,因此在多线程环境中需要进行同步处理,以避免并发问题。

返回类型

  • List.of() 返回的类型是 List 接口的一个实现,但它不是 ArrayList 或其他特定的列表类型。这是因为 List.of() 创建的列表是不可变的。
  • Arrays.asList() 返回的类型也是 List 接口的一个实现,但它的具体实现类是 ArrayList。这是因为它是基于数组的,同时也提供了列表接口的功能。

使用场景

现在让我们讨论在什么情况下使用 List.of()Arrays.asList()

适合使用 List.of() 的情况

  • 当你需要创建一个不可变的、固定长度的列表,并且不希望在后续的操作中修改列表时,可以使用 List.of()
  • 当你有一组元素,并且希望快速创建一个列表,而不需要显式地创建数组时,可以使用 List.of()
  • 在多线程环境下,如果你需要一个线程安全的不可变列表,List.of() 是一个很好的选择。
List<String> colors = List.of("Red", "Green", "Blue");

适合使用 Arrays.asList() 的情况

  • 当你已经有一个数组,并且希望将其转换为列表时,可以使用 Arrays.asList()
  • 当你需要一个可变的列表,以便在后续操作中添加、删除或修改元素时,可以使用 Arrays.asList()
  • 当你需要一个具有 ArrayList 功能的列表,同时又能使用 List 接口时,Arrays.asList() 是一个合适的选择。
String[] colorsArray = {"Red", "Green", "Blue"};
List<String> colorsList = Arrays.asList(colorsArray);

总结

List.of()Arrays.asList() 是 Java 中用于创建列表的两种不同方法,它们在不可变性、可变性、允许空元素、关联数组、返回类型等方面存在重要差异。你可以根据你的需求选择适当的方法。

  • 使用 List.of() 创建的列表是不可变的,适用于需要不可变性和线程安全性的情况。
  • 使用 Arrays.asList() 创建的列表是可变的,适用于需要在后续操作中修改列表的情况,同时它与底层数组关联。
  • 要注意 List.of() 不允许空元素,而 Arrays.asList() 允许。

最终,选择哪种方法取决于你的具体需求和代码设计。不同的场景可能需要不同的方法来满足需求,因此理解它们的特点和差异对于做出明智的决策至关重要。无论你选择哪种方法,都要确保根据需要正确使用它们,以获得最佳的性能和可维护性。

作者:c_and_v
链接:https://juejin.cn/post/7291152058483490874
来源:稀土掘金

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/110512.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“react“: “^16.14.0“,打开弹窗数据发生变化

“react”: “^16.14.0”, 弹窗 打开弹窗数据发生变化 // 这里对比changeHistoryVisible是否发生改变调用后端方法改变数据componentDidUpdate(prevProps) {if (prevProps.changeHistoryVisible ! this.props.changeHistoryVisible && this.props.changeHistoryVisi…

智慧公厕改变城市生活,厕所革命标杆应用解决方案

随着城市化进程的加快&#xff0c;公厕作为城市基础设施的重要组成部分&#xff0c;扮演着不可忽视的角色。然而&#xff0c;传统的公厕粗放型管理模式&#xff0c;已经无法满足市民日益增长的需求。为了提升公厕的管理和服务水平&#xff0c;智慧公厕应运而生。 什么是智慧公…

多模态大模型NextGPT整体结构图、模型示意图和使用模型时示意图

NextGPT模型整体结构 项目地址 论文地址 模型示意图 使用模型时示意图

第二证券:RTX 4090显卡全面下架,芯片巨头连续两日大跌!

英伟达RTX 4090显卡全面下架 在拜登政府更新针对人工智能&#xff08;AI&#xff09;芯片的出口控制规矩后的次日&#xff0c;英伟达RTX4090显卡已在各大购物网站下架。现在&#xff0c;网购途径京东上13款RTX 4090显卡均闪现“该产品已下柜”或“此产品暂时售完”&#xff0c…

PlatformIO在clion和vscode上的开发和使用,机器人开发嵌入式代码

vscode PlatformIO:2020年你还在用Arduino&#xff1f;&#xff1f;快开始用PlatformIO开发Esp8266/32、Arduino、STM32&#xff0c;十分钟亲测ESP8266 clion PlatformIO: clion platformio搭建 其他说明&#xff1a; 在vscode里使用platformio&#xff0c;可以选择开发的平台…

【Axure高保真原型】3D柱状图_中继器版

今天和大家分享3D柱状图_中继器版的原型模板&#xff0c;图表在中继器表格里填写具体的数据&#xff0c;调整坐标系后&#xff0c;就可以根据表格数据自动生成对应高度的柱状图&#xff0c;鼠标移入时&#xff0c;可以查看对应圆柱体的数据……具体效果可以打开下方原型地址体验…

尝试使用jmeter-maven-plugin

前提准备 1、maven项目 2、已安装JMeter、Jenkins、maven、jdk 环境要求&#xff1a; jmeter>5.6.2 maven >3.9 jdk>1.8 Jenkins ? 备注&#xff1a;jmeter-maven-plugin 无需下载&#xff0c;可查阅相关地址&#xff1a;GitHub - jmeter-maven-plugin/jmete…

教程更新 | 持续开源 RK3568驱动指南-驱动基础进阶篇

《iTOP-RK3568开发板驱动开发指南》手册文档更新&#xff0c;手册内容对应视频教程&#xff0c;后续资料会不断更新&#xff0c;不断完善&#xff0c;帮助用户快速入门&#xff0c;大大提升研发速度。 ✦ 第一篇 驱动基础 第1章 前言 第2章 你好&#xff01;内核源码 第3章 …

PXIE板卡,4口QSFP+,PCIE GEN3 X8,XILINX FPGA XCVU3P设计

PXIE板卡&#xff0c;4口QSFP&#xff0c;PCIE GEN3 X8&#xff0c;基于XILINX FPGA XCVU3P设计。 1&#xff1a;电路拓扑 ● 支持利用 EEPROM 存储数据&#xff1b; ● 电源时序控制和总功耗监控&#xff1b; 2&#xff1a;电路调试 3&#xff1a;测试 PCIE gen3 x8&#…

【音视频|ALSA】基于alsa-lib开发ALSA应用层程序--附带源码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

Linux下等待队列、定时器、中断综合应用——按键控制LED

本文通过按键控制LED的亮灭&#xff0c;按键每按一次&#xff0c;LED的状态就发生一次变化。 等待队列是为了在按键有动作发生时再读取按键值&#xff0c;而不是一直读取按键的值&#xff0c;使得CPU的占用率很高。 定时器在本实验中引入是为了按键消抖&#xff0c;在键值稳定了…

(Python)MATLAB mat矩阵和Python npy矩阵转换

Python np.ndarray矩阵转换为MATLAB mat文件 import numpy as npimport scipy.io as iomat_path mat_save_pathmat np.zeros([6, 128])io.savemat(mat_path, {name: mat})Python读取MATLAB mat文件 import numpy as np from scipy import iomat io.loadmat(your_mat_file.…

Linux——基础指令

Linux基础指令 ls 语法&#xff1a;ls【语法】【目录或文件】&#xff1a; 功能&#xff1a;对于目录&#xff0c;直接列出目录下所有文件。对于文件&#xff0c;列出文件名和其他信息 -a&#xff1a;列出目录下所有文件文件&#xff0c;包括隐藏文件-d&#xff1a;将目录像…

【前端设计模式】之建造者模式

建造者模式是一种创建型设计模式&#xff0c;它允许你按照特定的步骤构建复杂对象。该模式将对象的构造过程与其表示分离&#xff0c;使得同样的构造过程可以创建不同的表示。 建造者模式特性 将复杂对象的构建过程分解为多个简单步骤&#xff0c;使得代码更加可读、可维护。…

手写一个PrattParser基本运算解析器1: 编译原理概述

点击查看 基于Swift的PrattParser项目 编译原理概述 编译原理是我们每一个程序猿必须要了解的技能, 编译原理实际上并没有啥高深的技术, 我们如果在做业务开发, 也很少会用到编译开发的知识, 但是编译原理又是我们必备的基础知识之一. 所以我们需要对编译原理的内容有一个大概的…

【PXIE301-211】基于PXIE总线的16路并行LVDS数据采集、4路低速、2路隔离RS422数据处理平台

板卡概述 PXIE301-211A是一款基于PXIE总线架构的16路高速LVDS、4路低速LVDS采集、2路隔离RS422数据处理平台&#xff0c;该平台板卡采用Xilinx的高性能Kintex 7系列FPGA XC7K325T作为实时处理器&#xff0c;实现各个接口之间的互联。板载1组64位的DDR3 SDRAM用作数据缓存。板卡…

[Hive] explode

在 Hive 中&#xff0c;explode 函数用于将数组&#xff08;Array&#xff09;或者Map类型的列拆分成多行&#xff0c; 每个元素或键值对为一行。这允许我们在查询中对数组或 Map 进行扁平化操作。 下面是使用 explode 函数的示例&#xff1a; 假设我们有一个包含数组字段的表…

pycharm操作git

pycharm操作git 之前用命令做的所有操作&#xff0c;使用pychrm点点就可以完成 克隆代码 上方工具栏Git ⇢ \dashrightarrow ⇢ Clone ⇢ \dashrightarrow ⇢ 填写地址&#xff08;http、ssh&#xff09; 提交到暂存区&#xff0c;提交到版本库&#xff0c;推送到远程 直接…

Hadoop3教程(十九):MapReduce之ETL清洗案例

文章目录 &#xff08;121&#xff09;ETL数据清洗案例参考文献 &#xff08;121&#xff09;ETL数据清洗案例 ETL&#xff0c;即Extract-Transform-Load的缩写&#xff0c;用来描述数据从源端&#xff0c;经过抽取&#xff08;Extract&#xff09;、转换&#xff08;transfor…

HTTP和HTTPS

目录 HTTP协议 1.HTTP协议 2.HTTP请求 URL 方法 GET请求 post请求 header报头 请求正文&#xff08;body&#xff09; 3.HTTP响应 结构 常见的状态码 4.form表单构造HTTP请求 5.通过ajax构造HTTP请求 6.使用工具postman ​编辑 HTTPS 1.对称加密 2.非对称加密…