那些年踩过的坑之Arrays.asList

一、前言

        熟悉开发的兄弟都知道,在写新增和删除功能的时候,大多数时候会写成批量的,原因也很简单,批量既支持单个也支持多个对象的操作,事情也是发生在这个批量方法的调用上,下面我简单说一下这个事情。

二、场景描述

        批量方法的参数可能是一个list集合,里面存放了多个待操作的数据,这是批量方法。当我们操作单个对象的时候,也需要调用批量,那传参的时候,就涉及到把单个对象封装成集合,那么封装的方式有几种,我下边罗列一下。

    @Testpublic void listTest(){String code = "ITEM-001";//方式1batchOperate(Arrays.asList(code));//方式2batchOperate(Collections.singletonList(code));//方式3batchOperate(CollectionUtil.newArrayList(code));}

        我罗列了3种方式,但是我见过最多的就是使用第一种方式Arrays.asList(code),如果用了第一种的话,此时IDEA会给个小黄标提示,有点代码洁癖的人,会按照IDEA推荐的方式进行进一步修改,也就是我们第二种方式Collections.singletonList(code)。

        对于我个人来说,我推荐用第三种,而且我本人也是使用第三种传参方式,下面我们运行一下代码,首先我们来看一下第一种传参方式。

        通过运行代码,居然报add方法报错,是不是脑瓜子嗡嗡的?我们打个断点看一下,如下图所示,我们发现此时进行add方法的list是不是有点奇怪,不是我们常见的java.util下的ArrayList呀,为了更清晰,我们再深入一下,看看Arrays.asList是怎么一回事。

        进入到Arrays源码中,我们看到此ArrayList非彼ArrayList,而是Arrays的一个内部类,而且再仔细看看,发现这个内部类中居然没有add方法,但是确真真实实调用了add方法,它没有的话,应该是它所继承的父类中有add方法,我们继续进入到父类AbstractList中一探究竟。

        在AbstractList中,我们终于把add方法给揪出来了,从截图中可以看到,add方法中直接抛出了throw new UnsupportedOperationException(),这也就解释了为什么在调用add方法的时候报错了。

        来我们继续再看下一个Collections.singletonList(code)是怎么个情况

        果然,也报错了,而且报的错都一样,那么原因和刚才也大差不差。我们再点进去看看源码是什么样的。

        通过截图,我们可以看到,SingletonList也是Collections的一个内部类,而且也没有add方法,并且也继承自AbstractList,这时候就很明确了,调用add方法就会直接报错。我们顺便再看看其他的操作方法(如下图所示),基本上也都是报错,说明继承自AbstractList的子类是不允许对集合进行操作的。

        最后再看一下小永哥的选择测试结果会怎么样(希望不会翻车......)

        通过测试截图可以看到,没毛病,情况我们就分析到这里了。日常开发过程中应该用哪一种我想现在已经很明确了。

三、焦点访谈

        T哥:小永哥,有没有人说你很装呢?

        小永哥:好像除了你之外,还没有。

        T哥:你说的这三种传参有什么意义吗?随便一种都行吧,像你说的那种情况基本上不可能发生。

        小永哥:你说的有你的道理,但是谁能保证自己调用的方法都是自己写的,绝对安全可靠,我把参数传过去,人家想这么处理,完全不是我能控制的,但是因为传参的问题导致了报错,是不是得排查,为什么能一次性搞定的东西,要继续浪费时间和精力去处理呢?

        T哥,这次算你有道理.........

四、结语

        我分享的这些绝不是为了装,像这种看似简单,但是平时不常见的错误,解决不也得花时间吗,如果是生产环境报错,那排查、定位、解决花费的时间更多,有这功夫,我们摸会鱼,喝点咖啡它不香嘛。

        今天就分享到这里,谢谢大家,晚安。

        

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

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

相关文章

通过VIN车辆识别代码查询_精准版API,获取车辆精准参数

通过17位VIN码的精准匹配,帮助用户快速获取车辆的品牌、型号、出厂日期、排量、外观、车辆型号等详细参数。这一API广泛应用于二手车交易、车辆租赁、配件采购和车辆维修等领域,为用户提供一个高效、准确的解决方案。 代码示例 返回格式:js…

Virtuoso ADE采用Spectre仿真中出现MOS管最小长宽比满足要求依然报错的情况解决方法

在ADE仿真中错误问题如下: ERROR (CMI-2440): "xxx.scs" 46338: I2.M1: The length, width, or area of the instance does not fit the given lmax-lmin, wmax-wmin, or areamax-areamin range for any model in the I2.M3.nch_hvt group. The channel w…

LeetCode hot 100—最长有效括号

题目 给你一个只包含 ( 和 ) 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 示例 示例 1: 输入:s "(()" 输出:2 解释:最长有效括号子串是 "()"示例 2&#xf…

Vue3集成sass

安装依赖 pnpm add -D sass-embedded配置全局变量 新建文件 src/styles/variables.scss配置Vite 修改 vite.config.ts variables.scss $base-color: bluevite.config.ts // https://vite.dev/config/ export default defineConfig({plugins: [vue(),],resolve: {alias: {:…

【力扣题目分享】栈专题(C++)

目录 关于栈的题目: 1. 最小栈: 思路: 实现代码(最终): 2. 栈的压入、弹出序列: 思路: 实现代码: 3. 逆波兰表达式求值: 思路: 实现代码: 深入了解…

Office 2019 (含Visio+Project)官方IOS 下载

Microsoft Office 2019 是微软公司推出的一款办公软件套装, 主要包括Word、Excel、PowerPoint、Outlook、Visio、Access、Publisher、OneDrive for Business 和Skype for Business等组件。 这些组件适用于Windows和MacOS平台,支持多种语言&#xff0c…

遥测终端机,推动灌区流量监测向数据驱动跃迁

灌区范围那么大,每一滴水怎么流都关系到粮食够不够吃,还有生态能不能平衡。过去靠人工巡查、测量,就像拿着算盘想算明白大数据,根本满足不了现在水利管理的高要求。遥测终端机一出现,就像给灌区流量监测安上了智能感知…

P4017 最大食物链计数-拓扑排序

P4017 最大食物链计数 题目来源-洛谷 题意 要求最长食物链的数量。按照题意,最长食物链就是指有向无环图DAG中入度为0到出度为0的不同路径的数量(链数) 思路 在计算时,明显:一个被捕食者所…

Xmind快捷键大全

常规 插入主题和元素(常用) 编辑主题文本和样式 选择和移动 调整画布和视图 工具和其他

四. 以Annoy算法建树的方式聚类清洗图像数据集,一次建树,无限次聚类搜索,提升聚类搜索效率。(附完整代码)

文章内容结构: 一. 先介绍什么是Annoy算法。 二. 用Annoy算法建树的完整代码。 三. 用Annoy建树后的树特征匹配聚类归类图像。 一. 先介绍什么是Annoy算法 下面的文章链接将Annoy算法讲解的很详细,这里就不再做过多原理的分析了,想详细了解…

什么是电容?

什么是电容? 电荷与电压的比值就是电容量C。电容单位为法拉(F)。1法拉电容器在电压为1V时储存的电荷量为1库伦(C)。图1.1中的球体表面电压与储存的电荷Q关联。电压V等于。Q/V等于。如果球体位于电介质媒介中,电压V降低倍,Q/V等于。在电介质媒…

Linux服务器上mysql8.0+数据库优化

1.配置文件路径 /etc/my.cnf # CentOS/RHEL /etc/mysql/my.cnf # Debian/Ubuntu /etc/mysql/mysql.conf.d/mysqld.cnf # Ubuntu/Debian检查当前配置文件 sudo grep -v "^#" /etc/mysql/mysql.conf.d/mysqld.cnf | grep -v "^$&q…

MQTT学习资源

MQTT入门:强烈推荐

第十二章 Python语言-大数据分析PySpark(终)

目录 一. PySpark前言介绍 二.基础准备 三.数据输入 四.数据计算 1.数据计算-map方法 2.数据计算-flatMap算子 3.数据计算-reduceByKey方法 4.数据计算-filter方法 5.数据计算-distinct方法 6.数据计算-sortBy方法 五.数据输出 1.输出Python对象 (1&am…

【XR手柄交互】Unity 中使用 InputActions 实现手柄控制详解(基于 OpenXR + Unity新输入系统(Input Actions))

摘要: 本文主要介绍如何使用 Input Actions(Unity 新输入系统) OpenXR 来实现 VR手柄控制(监听ABXY按钮、摇杆、抓握等操作)。 🎮 Unity 中使用 InputActions 实现手柄控制详解(基于 OpenXR 新…

java实现网格交易回测

以下是一个基于Java实现的简单网格交易回测程序框架,以证券ETF(512880)为例。代码包含历史数据加载、网格策略逻辑和基础统计指标: import java.io.BufferedReader; import java.io.FileReader; import java.text.ParseException…

探秘 3D 展厅之卓越优势,解锁沉浸式体验新境界

(一)打破时空枷锁,全球触达​ 3D 展厅的首要优势便是打破了时空限制。在传统展厅中,观众需要亲临现场,且必须在展厅开放的特定时间内参观。而 3D 展厅依托互联网,让观众无论身处世界哪个角落,只…

第十二届蓝桥杯 2021 C/C++组 直线

目录 题目: 题目描述: 题目链接: 思路: 核心思路: 两点确定一条直线: 思路详解: 代码: 第一种方式代码详解: 第二种方式代码详解: 题目:…

微信小程序蓝牙连接打印机打印单据完整Demo【蓝牙小票打印】

文章目录 一、准备工作1. 硬件准备2. 开发环境 二、小程序配置1. 修改app.json 三、完整代码实现1. pages/index/index.wxml2. pages/index/index.wxss3. pages/index/index.js 四、ESC/POS指令说明五、测试流程六、常见问题解决七、进一步优化建议 下面我将提供一个完整的微信…

ubuntu opencv 安装

1.ubuntu opencv 安装 在Ubuntu系统中安装OpenCV,可以通过多种方式进行,以下是一种常用的安装方法,包括从源代码编译安装。请注意,安装步骤可能会因OpenCV的版本和Ubuntu系统的具体版本而略有不同。 一、安装准备 更新系统&…