Arrays.asList() 与 Collections.singletonList()的恩怨情仇

news2024/11/17 19:47:47

在这里插入图片描述

1. 概述

列表是我们使用 Java 时常用的集合类型。

众所周知,我们可以轻松地用一行初始化一个List。例如,当我们想要初始化一个只有一个元素的List时,我们可以使用Arrays.asList()方法或Collections.singletonList()方法。

在本文中,我们将讨论这两种方法之间的差异。然后,为了简单起见,我们将使用单元测试断言来验证某些操作是否按预期运行。

2.Arrays.asList ()方法

Arrays.asList ()方法返回一个固定大小的列表。

任何结构更改都会引发UnsupportedOperationException,例如,向列表添加新元素或从列表中删除元素。现在,让我们通过测试来检查一下:

List<String> arraysAsList = Arrays.asList("ONE");
Assert.assertThrows("新增Item",UnsupportedOperationException.class,
    () -> arraysAsList.add("TWO")
);

如果我们运行一下,测试就会通过。在上面的代码中,我们使用Assertj 的异常断言来验证当我们尝试向列表添加新元素时是否抛出UnsupportedOperationException 。

即使我们不能对列表调用add()或remove()操作,我们也可以使用set()方法更改列表中的元素 :

arraysAsList.set(0, "A brand new string");
assertThat(arraysAsList.get(0)).isEqualTo("A brand new string");

这次,我们使用新的String对象设置列表中的元素。如果我们执行测试,它就会通过。

Arrays.asList()方法的数组和返回的列表之间的关系。

顾名思义,该方法使数组作为 List工作。让我们了解“让数组像列表一样工作”意味着什么。

Arrays.asList ()方法返回一个List对象,该对象由给定的 array 支持。也就是说,该方法不会将数组中的元素复制到新的List对象。相反,该方法提供给定数组的列表视图。因此,我们对数组所做的任何更改都将在返回的列表中可见。同样,对列表所做的更改也将在数组中可见:

String[] theArray = new String[] { "ONE", "TWO" };
List<String> theList = Arrays.asList(theArray);
//改变列表,数组也会随之改变
theList.set(0, "ONE [changed in list]");
assertThat(theArray[0]).isEqualTo("ONE [changed in list]");

//改变数组,列表也会随之改变
theArray[1] = "TWO [changed in array]";
assertThat(theList.get(1)).isEqualTo("TWO [changed in array]");

测试通过。因此,对于数组和返回的列表,如果我们在一侧进行了一些更改,则另一侧也会更改。

3. Collections.singletonList()方法

singletonList()方法返回的列表只有一个元素。

与Arrays.asList()方法不同,singletonList()返回一个不可变的 list。

换句话说,不允许对singletonList() 返回的列表进行结构性和非结构性更改。一个测试可以快速说明这一点:

List<String> singletonList = Collections.singletonList("ONE");
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(
    () -> singletonList.add("TWO")
);
assertThatExceptionOfType(UnsupportedOperationException.class).isThrownBy(
    () -> singletonList.set(0, "A brand new string")
);

如果我们运行测试,它就会通过。因此,无论我们是向列表中添加元素还是更改列表中的元素,都会抛出UnsupportedOperationException。

值得一提的是,如果我们查看返回的列表类的源代码,与其他List实现不同,返回列表中的单个元素不会存储在数组或任何其他复杂的数据结构中。相反,列表直接保存元素对象:

private static class SingletonList<E> extends AbstractList<E> implements RandomAccess, Serializable {
    ...
    private final E element;

    SingletonList(E obj) {element = obj;}
    ...
}

因此,它需要更少的内存。

4. 总结

我们用表格总结一下Arrays.asList()方法和Collections.singletonList()方法的特点。

Arrays.asList()Collections.singletonList()
结构性变化不允许不允许
非结构性变化允许不允许
数据结构由数组支持直接握住元件

在这篇文章中,我们讨论了Arrays.asList()方法和Collections.singletonList()方法。

当我们想要初始化一个只有一个元素的固定大小列表时,我们可以考虑使用Collections.singletonList()方法。但是,如果需要更改返回列表中的元素,我们可以选择Arrays.asList()方法。

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

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

相关文章

电源控制系统架构(PCSA)之电源状态层级

目录 5.2 电源状态层级 5.2.1 Core电源状态 5.2.2 Cluster的电源状态 5.2.3 设备电源状态 5.2.4 SOC电源状态 5.2 电源状态层级 电源状态可以组织为电源状态表的层次结构。每个电源状态表描述在其层次结构级别上可用的电源状态。 从系统级电源控制的角度来看&#xff0c…

Java面向对象(高级)-- 抽象类与抽象方法(或abstract关键字)

文章目录 一、抽象类的由来&#xff08;1&#xff09;举例1&#xff08;2&#xff09;举例2 二、案例引入&#xff08;1&#xff09;抽象类&#xff08;2&#xff09;抽象方法&#xff08;3&#xff09;补充1&#xff08;4&#xff09;补充2&#xff08;5&#xff09;举例1. 举…

SpringBoot——定制错误页面及原理

优质博文&#xff1a;IT-BLOG-CN 一、SpringBoot 默认的错误处理机制 【1】浏览器返回的默认错误页面如下&#xff1a; ☞ 浏览器发送请求的请求头信息如下&#xff1a; text/html会在后面的源码分析中说到。 【2】如果是其他客户端&#xff0c;默认则响应错误的 JSON字符串&…

redis的性能管理、主从复制和哨兵模式

一、redis的性能管理 redis的数据时缓存在内存中的 查看系统内存情况 info memory used_memory:853688 redis中数据占用的内存 used_memory_rss:10522624 redis向操作系统申请的内存 used_memory_peak:853688 redis使用内存的峰值 系统巡检&#xff1a;硬件巡检、数据库 n…

【从浅识到熟知Linux】基本指令之rmdir和rm

&#x1f388;归属专栏&#xff1a;从浅学到熟知Linux &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;每日一句&#xff1a;加油努力&#xff0c;这次写完真的真的真的要去干饭了&#xff01; 文章前言&#xff1a;本文介绍rmdir和rm指令用法并给出示例和截图。 文…

【Java】智慧工地云平台源码(APP+SaaS模式)

在谈论“智慧工地”之前&#xff0c;我们首先得知道传统工地为什么跟不上时代了。 说起传统工地&#xff0c;总有一些很突出的问题&#xff1a;比如工友多且杂&#xff0c;他们是否入场、身体状况如何&#xff0c;管理人员只能依靠巡查、手工纪录来判断&#xff0c;耗时耗力&am…

在CentOS 7.9上搭建高性能的FastDFS+Nginx文件服务器集群并实现外部远程访问

文章目录 引言第一部分&#xff1a;FastDFS介绍与安装1.1 FastDFS简介1.2 FastDFS安装1.2.1 安装Tracker Server1.2.2 安装Storage Server 1.3 FastDFS配置1.3.1 配置Tracker Server1.3.2 配置Storage Server1.3.3 启动FastDFS服务 第二部分&#xff1a;Nginx配置2.1 Nginx安装…

在线定制印刷系统源码/定制云印刷/个性印刷在线DIY定制商城系统/全站DIV+CSS 布局+手机、PC端

源码简介&#xff1a; 在线定制印刷系统源码/定制云印刷&#xff0c;它是个性印刷在线DIY定制商城系统&#xff0c;而且全站采用DIVCSS 布局&#xff0c;可以手机、PC端实时互通。 支持多种产品定制&#xff0c;包括但不限于水杯、雨伞、U盘、T恤、衬衫和四件套。独创的制作间…

Django必备知识点(图文详解)

目录 day02 django必备知识点 1.回顾 2.今日概要 3.路由系统 3.1 传统的路由 3.2 正则表达式路由 3.3 路由分发 小结 3.4 name 3.5 namespace 3.4 最后的 / 如何解决&#xff1f; 3.5 当前匹配对象 小结 4.视图 4.1 文件or文件夹 4.2 相对和绝对导入urls​编辑…

使用git下载远程所有分支到本地

使用git下载远程所有分支到本地&#xff1a; 打开gitbash 输入以下命令即可&#xff1a; git clone git地址 cd git文件夹 git branch -r | grep -v \-> | while read remote; do git branch --track "${remote#origin/}" "$remote"; done git fetch -…

深度学习第1天:深度学习入门-Keras与典型神经网络结构

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 神经网络 介绍 结构 基本要素 Keras 介绍 导入 定义网络 模型训练 前馈神经网络 特点 常见类型 代码示例 反馈神经网络 特点 …

VC++彻底理解链接器:四,重定位

重定位 程序的运行过程就是CPU不断的从内存中取出指令然后执行执行的过程&#xff0c;对于函数调用来说比如我们在C/C语言中调用简单的加法函数add&#xff0c;其对应的汇编指令可能是这样的: call 0x4004fd 其中0x4004fd即为函数add在内存中的地址&#xff0c;当CPU执行这条…

全国测绘资质管理信息系统测绘资质申报流程

讲解一期关于测绘资质申请如何操作&#xff0c;在哪操作的问题&#xff0c;想要知道的按以下流程操作即可 &#xff08;注&#xff1a;以下操作为资质系统操作&#xff0c;想要能把资质申请下来&#xff0c;还需满足以下要求&#xff0c;后面会和系统操作一起统一讲解&#xf…

K8S如何部署ActiveMQ(单机、集群)

前言 大家好&#xff0c;在今天的讨论中&#xff0c;我们将深入研究如何将ActiveMQ迁移到云端&#xff0c;以便更好地利用Kubernetes的容器调度和资源管理能力&#xff0c;确保ActiveMQ的高可用性和可扩展性。 ActiveMQ是Apache开源组织推出的一款开源的、完全支持JMS1.1和J2…

IBM X3650M4安装ESXI6.5卡在/lsl_mr3.v00

环境&#xff1a;IBM X3650M4服务器双盘配置raid1&#xff0c;通过rufus制作启动U盘&#xff0c;安装VMware Vsphere 5.5系统 问题&#xff1a;卡在/lsi_mr3.v00界面无法往下运行&#xff08;两台配置一样的机器遇到同样的问题&#xff09; 解决方案&#xff1a; 直接在U盘根…

软件设计中如何画各类图之二深入解析数据流图(DFD):系统设计与分析的关键视觉工具

目录 1 前言2 数据流图&#xff08;DFD&#xff09;的重要性3 数据流图的符号说明4 清晰的数据流图步骤4.1 确定系统边界4.2 识别数据流4.3 定义处理过程4.4 确认数据存储4.5 建立数据流动的连线4.6 细化和优化 5 数据流图的用途6 使用场景7 实际应用场景举例8 结语 1 前言 当…

Eclipse 设置try-cacth 默认格式

设置面板 第一处 第二处 其中NsRuntimeException是自定义的异常处理。这样设置后&#xff0c;打开代码补全功能&#xff0c;输入try回车就会默认显示设置的代码

雅可比矩阵(Jacobian Matrix)

假设给定一个从n维欧式空间到m维欧式空间的变换: 雅可比矩阵就是将一阶偏导数排列成一个m行、n列形式的矩阵&#xff0c;记作&#xff1a; 举一个例子&#xff1a; 雅可比矩阵等于&#xff1a;

新手如何对一个web网页进行一次渗透测试

新手如何对一个web网页进行一次渗透测试 什么是渗透测试? 在获得web服务运营的公司书面授权的情况下&#xff0c;模拟攻击者的行为&#xff0c;以确定系统的脆弱性&#xff0c;并为保护系统提供有效的建议。 渗透测试和红蓝对抗的区别 渗透测试和红蓝对抗别再傻傻分不清楚…

ChatGPT重磅升级!集简云支持GPT4 Turbo Vision, GPT4 Turbo, Dall.E 3,Whisper等最新模型

在11月7日凌晨&#xff0c;OpenAI全球开发者大会宣布了 GPT-4的一次大升级&#xff0c;推出了 GPT-4 Turbo号称为迄今为止最强的大模型。 此次GPT-4的更新和升级在多个方面显示出强大的优势和潜力。为了让集简云用户能快速体验新模型的能力&#xff0c;我们第一时间整理了大会发…