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

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()方法。
相关文章:
Arrays.asList() 与 Collections.singletonList()的恩怨情仇
1. 概述 列表是我们使用 Java 时常用的集合类型。 众所周知,我们可以轻松地用一行初始化一个List。例如,当我们想要初始化一个只有一个元素的List时,我们可以使用Arrays.asList()方法或Collections.singletonList()方法。 在本文中&#x…...
Okhttp 浅析
安全的连接 OkHttpClient: OkHttpClient: 1.线程调度 2.连接池,有则复用,没有就创建 3.interceptor 4.interceptor 5.监听工厂 6.是否失败重试 7.自动修正访问,如果没有权限或认证 8是否重定向 followRedirects 9.协议切换时候是否继续重定向 10.Cookie jar 容器 默认…...
面试常见问题:什么是进程? 什么是线程?进程和线程有什么区别?
1.什么是进程? 进程是操作系统中一个程序在执行过程中的一个实例,每个进程都有自己独立的地址空间,进程间不共享内存。它是程序运行的最小内存单元; 进程特点: 1> 需要占用独立的内存空间; 2>可以并…...
什么是SQL?
SQL和MySQL是当今计算机领域中非常重要的两个概念。SQL是关系型数据库的查询语言,而MySQL是一种关系型数据库管理系统。它们在数据存储、管理和查询方面发挥着巨大的作用。在本文中,我们将深入探讨SQL和MySQL的定义、功能、应用以及它们之间的联系。 一…...
人力资源管理后台 === 基础环境+登陆
目录 1.人力资源项目介绍 1.1 项目架构和解决方案 1.2 课程安排 1.3 课程具备能力 1.4 课程地址 2. 拉取项目基础代码 3.项目目录和入口文件介绍 4.App.vue根组件解析 5.基础设置settings.js和导航守卫permission.js 6.Vuex的结构 7.使用模板中的Icon图标 8.扩展…...
Handler系列-怎么实现delay
1.前提 前面说到sendMessage携带的delay会被加上SystemClock.uptimeMillis() ,最终赋值给Message的when。 msg.when SystemClock.uptimeMillis() delayMillis; 那么when除了用来在链表里面作为排序依据以外,还在哪里用到了呢? 2.Looper…...
C++前缀和算法的应用:最大化城市的最小供电站数目
本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 二分法 题目 给你一个下标从 0 开始长度为 n 的整数数组 stations ,其中 stations[i] 表示第 i 座城市的供电站数目。 每个供电站可以在一定 范围 内给所…...
Centos/Linux安装Apahce出现bug汇总
源码安装Apache软件 使用软件:Apahce2.4.58,apr1.5.2, apr-util1.5.4 1.下载apr、apr-util和Apache软件; 2.安装apr压缩包,步骤如下: 第一、解压缩 tar zxvf apr-1.5.2.tar.gz第二、安装 cd /usr/local/sr…...
Scrapy爬虫异步框架(一篇文章齐全)
1、Scrapy框架初识 2、Scrapy框架持久化存储(点击前往查阅) 3、Scrapy框架内置管道(点击前往查阅) 4、Scrapy框架中间件(点击前往查阅) Scrapy 是一个开源的、基于Python的爬虫框架,它提供了…...
基于Hadoop架构的多重分布式BP神经网络的短期负荷预测方法
点我完整下载:基于Hadoop架构的多重分布式BP神经网络的短期负荷预测方法.docx 基于Hadoop架构的多重分布式BP神经网络的短期负荷预测方法 "A Short-term Load Forecasting Method based on Multi-distributed BP Neural Network Architecture with Hadoop Fram…...
Oracle查询数据库中当前用户每个表的数据条数
Oracle查询数据库中当前用户每个表的数据条数 select t.table_name,t.num_rows from user_tables t一般情况下这条语句就可查出想要结果 如果不行 请执行以下脚本 create or replace function count_rows(table_name in varchar2,owner in varchar2 default null)return…...
Windows从源码构建tensorflow(离线编译)
由一开始的在线编译,到后面的离线编译,一路踩坑无数,历经整整6个半小时,终于编译成功!在此记录一下参考过的文章,有时间整理一下踩坑记录。 一、环境配置 在tensorflow官网上有版本对应关系 win10 bazel …...
JMeter处理接口签名sign
写接口脚本的时候,很多接口涉及到签名,今天介绍下用JMeter编写签名脚本的方法。 举个例子,开启红包接口,请求方式为post POST /v1/api/red/open json请求参数 { "red_id":1, "timestamp":"1667033841…...
Android : Java中创建线程的几种方式_简单应用
主方法 MainTest.java package com.example.mythread;import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask;public class MainTest {public static void main(String[] data){ // 以下的方…...
C# Onnx 特征匹配 DeDoDe 检测,不描述---描述,不检测
目录 介绍 效果 模型信息 项目 代码 下载 介绍 github地址:https://github.com/Parskatt/DeDoDe DeDoDe 🎶 Detect, Dont Describe - Describe, Dont Detect, for Local Feature Matching The DeDoDe detector learns to detect 3D consisten…...
第十六章 处理空字符串和 Null 值
文章目录 第十六章 处理空字符串和 Null 值空字符串和 Null 值的默认映射导出值控制空元素的形式 第十六章 处理空字符串和 Null 值 类和属性参数 XMLUSEEMPTYELEMENT XMLIGNORENULL XMLNILNOOBJECT XMLNIL 空字符串和 Null 值的默认映射 下表总结了空字符串和 null 值的…...
MYSQL 处理重复数据
文章目录 前言防止表中出现重复数据统计重复数据过滤重复数据删除重复数据在这里插入代码片后言 前言 hello world欢迎来到前端的新世界 😜当前文章系列专栏:Mysql 🐱👓博主在前端领域还有很多知识和技术需要掌握,正…...
世岩清上:未来科技展览的策展视野
面对科技未来,策展视野的核心在于把握趋势,理解人性,并充分运用科技手段提升观众的体验。以下是我对未来科技展览的策展视野。 一、以人为本的设计理念 科技发展的最终目的是服务于人类,提升人们的生活质量。因此,展…...
如何理解2023vivo开发者大会,使用Rust语言编写蓝河操作系统(BlueOS)?
在2023年vivo开发者大会上,vivo宣布使用Rust语言编写其蓝河操作系统(BlueOS)。 什么是Rust语言? Rust 是一种开放源代码系统编程语言,可用于开发高效、安全的软件。 使用 Rust 可管理内存并控制其低级详细信息。 但你…...
Android flutter this and base files have different roots
类似经历者 Android build fails with certain plugins if project is in a different drive (from sdk) 错误描述 我是windows系统,下载 flutter sdk 我是放在D盘,flutter项目是放在E盘,flutter 执行 pub get的时候,会在我C盘…...
Autosar MCAL避坑指南:EB配置GPT模块时,中断回调与时钟源这些细节千万别忽略
Autosar MCAL实战避坑:GPT模块配置中的高阶调试技巧 当你在凌晨三点的实验室里盯着纹丝不动的LED灯,而截止日期就在明天时,就会明白GPT模块的配置远不止勾选几个复选框那么简单。作为Autosar架构中的时间指挥官,通用定时器&#x…...
收藏!工程师小白轻松入门大模型,从零到实战的学习路线图
本文分享作者从零基础自学AI的经历,强调工程师应从上层应用入手而非底层原理。推荐通过B站、油管(李宏毅老师课程)、GitHub开源项目(如deer-flow、MiroMind)等资源系统学习大模型。作者建议先掌握langchain、langgraph…...
【大模型】LoRA微调实战指南:从原理到落地应用
1. LoRA微调技术:为什么它成为大模型优化的新宠? 第一次接触LoRA微调是在去年优化客服对话系统时。当时我们用GPT-3处理专业领域咨询,发现直接使用基础模型会出现大量行业术语理解错误。传统全参数微调需要40GB显存,而我们的显卡只…...
Kandinsky-5.0-I2V-Lite-5s新手常见问题解答:生成慢/黑屏/无响应排查指南
Kandinsky-5.0-I2V-Lite-5s新手常见问题解答:生成慢/黑屏/无响应排查指南 1. 问题概述 Kandinsky-5.0-I2V-Lite-5s是一款轻量级图生视频模型,用户只需上传一张首帧图片并补充运动或镜头描述,就能生成约5秒、24fps的短视频。虽然该模型已经针…...
如何在本地安全提升英雄联盟游戏体验?LeagueAkari工具包全面解析
如何在本地安全提升英雄联盟游戏体验?LeagueAkari工具包全面解析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟游戏中…...
【多模态大模型缓存优化白皮书】:20年架构师亲授3类缓存失效陷阱与5层分级缓存落地实践
第一章:多模态大模型缓存策略优化 2026奇点智能技术大会(https://ml-summit.org) 多模态大模型在处理图像、文本、音频等异构输入时,面临显著的缓存效率瓶颈:不同模态特征向量维度差异大、访问局部性弱、中间激活内存占用高,导致…...
基于深度学习的yolo车辆特征属性识别 多特征检测+车辆颜色识别+车辆朝向识别+车辆检测+多标签属性识别
车辆检测和多标签属性识别:基于PyTorch的精简框架 在现代智能交通系统中,车辆检测和属性识别是至关重要的组成部分。它们能够帮助我们更好地理解和管理交通流量、优化城市规划,并提高道路安全。本文将介绍一个基于PyTorch构建的轻量级框架&am…...
三步搞定M3U8视频下载:N_m3u8DL-CLI-SimpleG完全指南
三步搞定M3U8视频下载:N_m3u8DL-CLI-SimpleG完全指南 【免费下载链接】N_m3u8DL-CLI-SimpleG N_m3u8DL-CLIs simple GUI 项目地址: https://gitcode.com/gh_mirrors/nm3/N_m3u8DL-CLI-SimpleG 还在为复杂的命令行操作而烦恼吗?想要轻松下载在线视…...
FEKO中地平面类型与计算参数的高级配置指南
1. FEKO地平面类型详解与选择策略 第一次用FEKO做电磁仿真时,我被地平面选项搞得一头雾水——明明都是模拟地面效应,为什么要有三种不同配置?后来在调试一个车载天线模型时,自由空间和Sommerfeld积分的结果差异竟然达到15dB&#…...
企业级京东自动评价系统架构设计:深度解析高可用解决方案
企业级京东自动评价系统架构设计:深度解析高可用解决方案 【免费下载链接】jd_AutoComment 自动评价,仅供交流学习之用 项目地址: https://gitcode.com/gh_mirrors/jd/jd_AutoComment 在电商平台自动化运营领域,京东自动评价系统面临着多重技术挑…...
