不是什么高深玩意,Arrays.asList、ArrayList.subList需要注意的坑

news/2024/5/20 14:52:01/文章来源:https://blog.csdn.net/weixin_42329623/article/details/130396223

前言

集合是日常工作中几乎每天都在用的玩意,也是八股文中被翻烂的东西,诸如List、Map,确实很重要也很实用,但是不注意细节就比较容易踩坑。比较常见的就是今天要整理的Arrays.asList和ArrayList.subList。不是什么高深的东西,日常一整理。

最常用的写法

 List<Integer> list = new ArrayList<>();
 list.add(10);
 list.add(20);

使用Arrays.asList的注意事项

踩坑的大部分原因

图方便,有时候对于少量的几个元素,心想着这不是有现成的方法吗,好,梭哈

List<Integer> statusList = Arrays.asList(1, 2);

不好意思,这确实没少毛病。上线后一段时间,需要加n个元素,看到有集合,easy,好,在原来的基础上继续梭哈,代码变成这样

List<Integer> statusList = Arrays.asList(1, 2);
statusList.add(3);

上线后,boom!检查问题,还死鸭子嘴硬,这代码这么简单,肯定不是这个地方出错,看一下报错:

alt

原因分析

点进去,看一下Arrays类提供的静态方法asList的源码:

alt 细心一看,就会发现此ArrayList并不是我们经常使用的ArrayList,因为我们平时经常使用的ArrayList是位于java.util包下的:

alt 但是此处的ArrayList却是Arrays类的内部类,继续看看他的继承类,

alt 它也继承了AbstractList类,重写了很多方法,比如我们上面使用的contains方法,但是却没有重写add方法,所以我们在调用add方法时才会抛出java.lang.UnsupportedOperationException异常。

在《阿里巴巴Java开发手册》泰山版中,有说明这个注意点:

使用工具类 Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。

alt

小结

简单场合可以使用Arrays.asList,比如快速声明一个集合,判断某个值是否在允许的范围内,但是不要调用他的修改方法,实在要用,先看看是否有重新对应的方法。

使用ArrayList的subList的注意事项

先看个Demo

List<String> bookList = new ArrayList<>();
bookList.add("天道");
bookList.add("倚天屠龙记");
bookList.add("阿甘正传");
bookList.add("你好,明天");
bookList.add("我是谁");

List<String> subBookList = bookList.subList(3, 5);
System.out.println(bookList);
System.out.println(subBookList);

执行结果如下:

alt

从运行结果可以看出,subList返回的是bookList中索引从fromIndex(包含)到toIndex(不包含)的元素集合。

使用起来很简单,主要有以下几点要注意,否则会造成程序错误或者异常:

  • 修改原集合元素的值,会影响子集合
  • 修改原集合的结构,会引起ConcurrentModificationException异常
  • 修改子集合元素的值,会影响原集合
  • 修改子集合的结构,会影响原集合 以上几点在《阿里巴巴Java开发手册》泰山版中是这样描述的:
alt

修改原集合的值,会影响子集合

如下验证:

alt

可以看出,虽然我们只是修改了原集合bookList的值,但是影响到了子集合subBookList

修改原集合的结构,会引起ConcurrentModificationException异常

alt 温馨提醒:其实装好相关的插件,会自然提示可能出现的异常,可以整一下

修改子集合的值,会影响原集合

alt

修改子集合的结构,会影响原集合

alt

原因分析

看下subList方法的注释,了解下它的用途:

alt
  • 简单理解:返回指定的{@code fromIndex}(包含)和{@code toIndex}(排除)之间的列表部分的视图。 看下它的源码:
public List<E> subList(int fromIndex, int toIndex) {
    subListRangeCheck(fromIndex, toIndex, size);
    return new SubList(this, 0, fromIndex, toIndex);
}

它调用了SubList类的构造函数,该构造函数的源码如下图所示:

alt

可以看出,SubList类是ArrayList的内部类,该构造函数中也并没有重新创建一个新的ArrayList,所以修改原集合或者子集合的元素的值,是会相互影响的。

写在最后

好了,明白了是什么原因了吧。不要图方便,不看清他的原理。这里是"安前码后",一个分享实用内容的号,觉得用心整理的,帮忙给个三连。更多内容持续输出中。

本文由 mdnice 多平台发布

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

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

相关文章

Oracle跨服务器取数——DBlink 初级使用

前言 一句话解释DBlink是干啥用的 实现跨库访问的可能性. 通过DBlink我们可以在A数据库访问到B数据库中的所有信息,例如我们在加工FDS层表时需要访问ODS层的表,这是就需要跨库访问 一、DBlink的分类 private&#xff1a;用户级别&#xff0c;只有创建该dblink的用户才可以使…

一篇文章告诉你金融行业如何高效管理文件

由于金融行业的行业属性&#xff0c;信息安全万分重要。因此在文件管理工具时&#xff0c;要注意数据安全问题&#xff0c;那么金融行业如何高效管理文件呢&#xff1f; 首先金融行业在文件管理时可能面临以下问题&#xff1a; 1&#xff0c;资料繁杂&#xff0c;整理困难&…

starrocks基于prometheus实现监控告警

监控报警 本文介绍如何为 StarRocks 设置监控报警。 StarRocks 提供两种监控报警的方案。企业版用户可以使用内置的 StarRocksManager&#xff0c;其自带的 Agent 从各个 Host 采集监控信息&#xff0c;上报至 Center Service&#xff0c;然后做可视化展示。StarRocksManager …

虹科新品 | 用于医疗应用的压力和气体流量传感器

ES Systems在创新MEMS方面拥有丰富的经验&#xff0c;设计了高质量和高性能的气体流量和压力传感器&#xff0c;由于其技术规格&#xff0c;出色的可靠性和有竞争力的价格&#xff0c;这些传感器在竞争产品中具有独特的品质。 Part.01 应用背景 众所周知&#xff0c;在医疗领域…

在函数中使用变量

shell脚本编程系列 向函数传递参数 函数可以使用标准的位置变量来表示在命令行中传给函数的任何参数。其中函数名保存在$0变量中&#xff0c;函数参数则依次保存在$1、$2等变量当中&#xff0c;也可以使用特殊变量$#来确定参数的个数 在脚本中调用函数时&#xff0c;必须将参…

【SWAT水文模型】SWAT水文模型建立及应用第四期: 气象数据的准备(待更新)

SWAT水文模型建立及应用&#xff1a; 气象数据的准备 1 简介2 气象数据的准备&#xff08;传统气象站&#xff09;2.1 天气发生器各参数的计算2.2 降水及气温输入数据的准备 3 气象数据的准备&#xff08;中国区域高精度同化气象站CMADS&#xff09;参考 本博客主要介绍气象数据…

本周一至周三总结

周一 学习如何进行竞品分析 对软件杯项目进行了竞品分析&#xff0c;测试了十余个强相关网站&#xff0c;为团队写好了竞品分析报告 分别对主要目标&#xff0c;竞品优劣点&#xff0c;竞品选择原因&#xff0c;产品创新点等进行了分析和阐述 周二 下午晚上刷了五道题 题解…

Android 项目必备(四十五)-->2023 年如何构建 Android 应用程序

Android 是什么 Android 是一种基于 Linux 内核并由 Google 开发的开源操作系统。它用于各种设备包括智能手机、平板电脑、电视和智能手表。 目前&#xff0c;Android 是世界上移动设备使用最多的操作系统; 根据 statcounter 的一份最近 12 个月的样本报告;Android 的市场份额…

Xcode14 设置Display Name不生效问题

一、前言 早在Xcode13苹果就对Info.plist做了一次大改革&#xff0c;新建的OC项目默认Info.plist文件是“空的”&#xff0c;Swift项目甚至干脆连Info.plist文件都没有了&#xff0c;苹果这样做是为了建立一个新的Info.plist管理方式&#xff0c;把Info.plist物理文件中的配置…

根据虚拟地址,如何求出页号和偏移量?

方法掌握 虚拟地址划分成虚拟页号和虚拟页偏移量。 物理地址同样可划分为物理页号和物理页偏移量 如何划分&#xff0c;关键点在于页面的大小。 假设给你一个十进制表示的地址20000&#xff0c;一个页面的大小为4KB&#xff0c;那么如何找出地址20000的具体位置呢&#xff1f…

合并两个有序链表

文章目录 1.题目描述2.解题思路方法1&#xff1a;方法2&#xff1a; 1.题目描述 题目链接&#xff1a;力扣21&#xff0c;合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2.解题思路 方法1&#xff1a;…

脚本函数基础

shell脚本编程系列 函数是一个脚本代码块&#xff0c;可以为其命名并在脚本中的任何位置重用它。每当需要在脚本中使用该代码块时&#xff0c;直接写函数名即可。称作调用函数。 创建函数 方式1&#xff1a; function name {commands }name定义了该函数的唯一名称&#xff0…

1分钟学会Midjourney十种绘图风格关键词

Midjourney最新V5版的卡通模型中最流行的就是皮克斯&#xff0c;今天介绍十种绘图风格。我们统一用如下描述词来绘制&#xff0c;每次只是风格不一样&#xff0c;对比看看。 首先我们先画一个皮克斯风格(Pixar)&#xff0c;打开ai绘图软件&#xff0c;点击左上角的图像绘制&a…

camunda流程引擎send task节点用途

Camunda的Send Task用于向外部系统或服务发送消息。消息可以是同步或异步的&#xff0c;可以发送到队列、主题或其他类型的消息中间件。Send Task通常用于将消息发送到外部系统&#xff0c;而无需等待响应或结果。相反&#xff0c;它只是向外部系统发出信号&#xff0c;通知其执…

android不可不知调试技巧

目录 1、条件断点 2、评估表达式&#xff08;Evaluate Expression&#xff09; 3、日志断点 4、方法断点 5、异常断点 6、Field WatchPoint 1、条件断点 假设我们列表循环的某个元素时候才暂停&#xff0c;就用这种方式。具体方式在循环列表打断点&#xff0c;对着断点右…

焕新时刻,移动云品牌升级燃动十一城

4月25日&#xff0c;在2023移动云大会上&#xff0c;移动云品牌形象全方位焕新&#xff0c;启用新品牌LOGO和品牌标语&#xff0c;在政府领导、院士专家、行业大咖等3000多位参会嘉宾见证下&#xff0c;吹响品牌进阶新号角。 24日晚&#xff0c;移动云品牌焕新亮灯仪式率先在苏…

【计网】WebSocket协议

目录 一、背景 二、WebSocket握手过程 三、SpringBoot中使用WebSocket协议 1、服务器 2、客户端 一、背景 一般的web开发以请求响应为主即客户端发送一个请求&#xff0c;服务器返回一个响应&#xff0c;这就使得类似聊天等需求基于HTTP协议进行实现时比较消费资源&#xf…

CF - Playing in a Casino

题意&#xff1a;一个数的幸运值计算规则是用里面最大的数字-最小的数字所得值 给出一个范围&#xff0c;求这个范围里幸运值最大的是哪个数 解&#xff1a; 这道题相对来说就很简单了&#xff0c;注意数值限制范围在1道1e6&#xff0c;虽然这道题确实暴力就能做出来&#xf…

【数据分析之道-Pandas(二)】DataFrame

文章目录 专栏导读1、DataFrame简介2、DataFrame创建2.1字典创建DataFrame2.2列表创建DataFrame2.3ndarrays 创建DataFrame2.4CSV文件创建DataFrame 3、DataFrame基本操作3.1添加列3.2删除列 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&…

13 JS04——运算符

目标&#xff1a; 1、运算符 2、算数运算符 3、递增和递减运算符 4、比较运算符 5、逻辑运算符 6、赋值运算符 7、运算符优先级 一、运算符 1、概念 运算符&#xff08;operator&#xff09;也被称作操作符&#xff0c;是用于实现赋值、比较和执行算数运算等功能的符号。 2…