当前位置: 首页 > news >正文

Arrays.asList() 和 List.of() 的列表之争

在这里插入图片描述

1. 概述

有时在Java中,为了方便,我们需要创建一个小列表或将数组转换为列表。Java 为此提供了一些辅助方法。

在本文中,我们将比较初始化小型临时数组的两种主要方法:List.of()和 Array.asList()。

2. Arrays.asList()

Java 自1.2版本引入的Arrays.asList(),从而简化了List对象的创建,该对象是Java Collections Framework的一部分。它可以将数组作为输入的同时并创建所提供数组的List对象。
方法源码:

public static <T> List<T> asList(T... a) {return new ArrayList<>(a);
}

说白了就是拿参数直接new了一个对象,和自己创建一个数组是一样一样的。

示例:

Integer[] array = new Integer[]{1, 2, 3, 4,5};
List<Integer> list = Arrays.asList(array);MatcherAssert.assertThat("匹配项不相等",list, Matchers.containsInAnyOrder(1,2,3,4,5));

创建一个简单的整数列表非常容易。

2.1. 返回列表上不支持的操作

asList()方法返回一个固定大小的列表。因此,添加和删除新元素都会抛出UnsupportedOperationException。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Assert.assertThrows("新增Item",UnsupportedOperationException.class, () -> list.add(6));List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
Assert.assertThrows("删除Item",UnsupportedOperationException.class, () -> list.remove(1));

2.2. 使用数组

我们需要注意的是,列表不会创建输入数组的副本。相反,它使用List接口包装原始数组。因此,对数组的更改也会反映在列表上:

Integer[] array = new Integer[]{1,2,3};
List<Integer> list = Arrays.asList(array);
array[0] = 1000;
MatcherAssert.assertThat("list.get(0)的结果不等于1000",list.get(0),Matchers.equalTo(1000));

2.3. 更改返回列表

另外,Arrays.asList()返回的列表是可变的。也就是说,我们可以更改列表的各个元素:

List<Integer> list = Arrays.asList(1, 2, 3, 4);
list.set(1, 1000);
MatcherAssert.assertThat("list.get(0)的结果不等于1000",list.get(0),Matchers.equalTo(1000));

最终,这可能会导致不良的副作用,从而导致难以发现的错误。当提供数组作为输入时,列表上的更改也将反映在数组上:

Integer[] array = new Integer[]{1, 2, 3};
List<Integer> list = Arrays.asList(array);
list.set(0,1000);
assertThat(array[0]).isEqualTo(1000);

小结:使用Arrays.asList()创建的列表,可以对内容值进行更改,但是不能对列表的长度进行更改。

我们看看另一种创建列表的方法。

3. List.of()

与数组asList()方法相反,在Java 9 中引入了一个更方便的新的方法:List.of()。它将创建不可修改的List对象的实例:

Integer[] array = new Integer[]{1, 2, 3, 4,5};List<Integer> list = List.of(array);MatcherAssert.assertThat("匹配项不相等",list, Matchers.containsInAnyOrder(1,2,3,4,5));

3.1. 与Arrays.asList()的区别

与Arrays.asList()的主要区别在于List.of ()返回一个不可变列表,该列表是所提供的输入数组的副本 。因此,对原始数组的更改不会反映在返回的列表中:

Integer[] array = new Integer[]{1, 2, 3, 4, 5};
List<Integer> list = List.of(array);
array[0] = 1000;
MatcherAssert.assertThat("list.get(0)的值不为1",list.get(0),Matchers.equalTo(1));

此外,我们无法修改列表的元素。如果我们尝试这样做,它将抛出UnsupportedOperationException:

List<String> list = List.of(1, 2, 3, 4, 5);
assertThrows(UnsupportedOperationException.class, () -> list.set(1, 6));

3.2. 空值

我们还应该注意List.of()不允许空值作为输入,并且会抛出NullPointerException:

assertThrows(NullPointerException.class, () -> List.of(1, null, 2));

4。结论

Arrays.asList()返回由指定数组支持的固定大小列表。对数组所做的更改将在返回的列表中可见,对列表所做的修改将在数组中可见。返回的列表是Serializable的,并实现了RandomAccess。
List.of()返回包含任意数量元素的不可修改列表。另外,此方法还接受单个数组作为参数。结果列表的元素类型将是数组的组件类型,列表的大小将等于数组的长度。要使用作为数组的单个元素创建列表,请执行以下操作:

String[] array = ... ;  
List<String[]> list = List.<String[]>of(array);

这将导致List.of(E)方法被调用。

相关文章:

Arrays.asList() 和 List.of() 的列表之争

1. 概述 有时在Java中&#xff0c;为了方便&#xff0c;我们需要创建一个小列表或将数组转换为列表。Java 为此提供了一些辅助方法。 在本文中&#xff0c;我们将比较初始化小型临时数组的两种主要方法&#xff1a;List.of()和 Array.asList()。 2. Arrays.asList() Java 自…...

基于51单片机的停车场管理系统仿真电路设计

**单片机设计介绍&#xff0c;基于51单片机的停车场管理系统仿真电路设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 停车场管理系统仿真电路设计介绍 停车场管理系统主要用于自动化管理和控制停车场&#xff0c;以提高停车…...

APIView单一资源的查看更新删除

APIView单一资源的查看更新删除 一、构建路由 re_path("author/(/d)",AuthorDetailView.as_view)), 二、视图类 在views.py中添加AuthorDetailView类 class AuthorDetailView(APIView):def get(self, request, pk):author Author.objects.get(pkpk)serializer A…...

UML--类图的表示

1. 类的表示 1.1 访问属性 : public -: private #: protected 1.2 接口与抽象类 斜体 表示抽象类和抽象方法 <<Interface>> 类表示接口 1.3 类图示意 Mclass- val: int getVal(): int 2. 类关系 2.1 实现关系 空心三角形和虚线组成 B实现A,则三角形尖尖朝…...

JVM字节码文件浅谈

文章目录 版权声明java虚拟机的组成字节码文件打开字节码文件的姿势字节码文件的组成魔数&#xff08;基本信息&#xff09;主副版本号&#xff08;基本信息&#xff09;主版本号不兼容的错误解决方法基本信息常量池方法 字节码文件的常用工具javap -v命令jclasslib插件阿里art…...

DBever 连接trino时区问题 The datetime zone id ‘GMT+08:00‘ is not recognised

DBever连接trino 测试连接成功&#xff0c;但是执行sql报时区不对、如果你默认使用的是大于jdk8的版本 会存在这个问题&#xff0c;因为jdk版本 jdk8 和jdk17 版本默认时区是不同的 trino官网明确说明了时区默认跟jdk走 解决方案 可以先行查看JDK本地时区库版本&#xff0c;执…...

xlua源码分析(二)lua Call C#的无wrap实现

xlua源码分析&#xff08;二&#xff09;lua Call C#的无wrap实现 上一节我们主要分析了xlua中C# Call lua的实现思路&#xff0c;本节我们将根据Examples 03_UIEvent&#xff0c;分析lua Call C#的底层实现。例子场景里有一个简单的UI面板&#xff0c;面板中包含一个input fie…...

MySql优化经验分享

一条sql的具体执行过程 连接 我们怎么查看MySQL当前有多少个连接&#xff1f; 可以用show status命令&#xff0c;模糊匹配Thread&#xff0c; Show global status like "Thread%" show global variables like wait timeout;—非交互式超时时间&#xff0c;如JDBC…...

【Linux】:使用git命令行 || 在github创建项目 || Linux第一个小程序——进度条(进阶版本)

在本章开始之前还是先给大家分享一张图片 这是C的笔试题 感兴趣的同学可以去试一试 有难度的哟 也可以直接在牛客网直接搜索这几道题目哈 好了今天我们正式进入我们的正题部分 &#x1f556;1.使用git命令行 安装git yum install git&#x1f560;2.在github创建项目 使用…...

Kotlin apply 交换两个数

代码&#xff1a; fun main() {var a 1var b 2a b.apply {b aprintln("$b")println("$this")}println("$a $b") }打印结果&#xff1a; 1 2 2 1原理分析&#xff1a; /*** Calls the specified function [block] with this value as its r…...

Android jetpack : Navigation 导航 路由 、 单个Activity嵌套多个Fragment的UI架构方式

Android Navigation 如何动态的更换StartDestination &&保存Fragment状态 Navigation(一)基础入门 google 官网 &#xff1a; Navigation 导航 路由 讨论了两年的 Navigation 保存 Fragment 状态问题居然被关闭了 Navigation是一种导航的概念&#xff0c;即把Activ…...

【react】在react中祖父、父亲、孙子组件层层解构其余属性props时报错children.forEach is not function

起因 报错children.forEacht is not function 分析原因 由于地址组件本身存在options&#xff0c;此时父组件又传递…otherProps&#xff0c;且解构了父级组件的otherProps&#xff0c;其中others解构后的属性就有options&#xff0c;因此产生了属性冲突&#xff0c;导致属性…...

P9831 [ICPC2020 Shanghai R] Gitignore

P9831 [ICPC2020 Shanghai R] Gitignore - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 只看题意翻译这道题是做不出来的&#xff0c;还要去看英文里面的规定&#xff08;这里就不放英文了&#xff09;&#xff0c;主要问题是不要公用子文件夹。 例如: 1 / a / 2 2 / a / 3…...

LinkList集合方法(自写)

在使用以下方法时需要定义一个LinkNode类来定义变量&#xff0c;new一个新对象进行调用&#xff0c;输出时需要定义输出方法 public class ListNode {int value;ListNode next;//public ListNode(int value) {this.value value;}public String toString(){return "ListN…...

Ansible playbook自动化运维工具详解

Ansible playbook自动化运维工具详解 一、playbook的相关知识1.1、playbook 的简介1.2、playbook的 各部分组成 二、基础的playbook剧本编写实例三、 playbook的定义、引用变量3.1、基础变量的定义与引用3.2、引用fact信息中的变量 四、playbook中的when条件判断和变量循环使用…...

图像切分:将一张长图片切分为指定长宽的多张图片

1.需求 比如有一张很长的图片其大小为宽度779&#xff0c;高度为122552&#xff0c;那我想把图片切分为779乘以1280的格式。 步骤如下&#xff1a; 使用图像处理库&#xff08;如PIL或OpenCV&#xff09;加载原始图片。确定子图片的宽度和高度。计算原始图片的宽度和高度&am…...

ROS学习笔记(5):ros_control

1.ros_control简介 ros_control - ROS Wiki ros_control是为ROS提供的机器人控制包&#xff0c;包含一系列控制器接口、传动装置接口、控制器工具箱等,有效帮助机器人应用功能包快速落地&#xff0c;提高开发效率。 2.ros_control框架 ros_control总体框架&#xff1a; 针对…...

《008.Springboot+vue之自习室选座系统》

[火]《008.Springbootvue之自习室选座系统》 项目简介 [1]本系统涉及到的技术主要如下&#xff1a; 推荐环境配置&#xff1a;DEA jdk1.8 Maven MySQL 前后端分离; 后台&#xff1a;SpringBootMybatisredis; 前台&#xff1a;vueElementUI; [2]功能模块展示&#xff1a; 前端…...

道可云元宇宙每日资讯|5G数智新时代元宇宙发展论坛在厦门举办

道可云元宇宙每日简报&#xff08;2023年11月6日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 5G数智新时代元宇宙发展论坛在厦门举办 3日&#xff0c;由2023年中国金鸡百花电影节执委会主办、厦门电影节有限公司协办的“5G数智新时代元宇宙发展论坛暨‘中国白德…...

使用 Go 写入文件

在本教程中&#xff0c;我们将学习如何使用 Go 将数据写入文件。我们还将学习如何同时写入文件。 本教程有以下部分 将字符串写入文件将字节写入文件逐行将数据写入文件附加到文件同时写入文件 由于 Playground 不支持文件操作&#xff0c;请在本地系统中运行本教程的所有程…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...