Java开发手册中为什么要求谨慎使用ArrayList中的sublist方法

news2024/10/6 1:36:38

场景

Java开发手册中对于ArrayList的subList的要求如下:

【强制】ArrayList 的 subList 结果不可强转成 ArrayList,否则会抛出 ClassCastException 异常:

java.util.RandomAccessSubList cannot be cast to java.util.ArrayList。

说明:subList()返回的是 ArrayList 的内部类 SubList,并不是 ArrayList 本身,

而是 ArrayList 的一个视图,对于 SubList 的所有操作最终会反映到原列表上。

 

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

subList 是 List 接口中定义的一个方法,该方法主要用于返回一个集合中的一段、可以理解为截取一个集合中的部分元素,

他的返回值也是一个 List。

使用示例:

        List<String> names = new ArrayList<String>(){{
            add("ba");
            add("dao");
            add("de");
            add("cheng");
            add("xv");
            add("yuan");
        }};

        List<String> subList = names.subList(0, 2);
        System.out.println(subList);

但是如果将subList的返回值强转为ArrayList则会抛出异常java.util.ArrayList$SubList cannot be cast to java.util.ArrayList

ArrayList<String> subList1 = (ArrayList<String>) names.subList(0, 2);

查看sublist的源码可知

Returns a view of the portion of this list between the specified fromIndex, inclusive, and toIndex, exclusive.

 (If fromIndex and toIndex are equal, the returned list is empty.)

 The returned list is backed by this list, so non-structural changes in the returned list are reflected in this list,

and vice-versa. The returned list supports all of the optional list operations supported by this list.

翻译过来就是

返回此列表中位于指定的fromIndex(包含)和toIndex(排除)之间的部分的视图。

(如果fromIndex和toIndex相等,则返回的列表为空。)

返回的列表由该列表支持,因此返回列表中的非结构性更改会反映在此列表中,

 反之亦然。返回的列表支持此列表支持的所有可选列表操作。

 

这个方法返回了一个 SubList,这个类是 ArrayList 中的一个内部类。

            public List<E> subList(int fromIndex, int toIndex) {
                subListRangeCheck(fromIndex, toIndex, size);
                return new SubList(this, 0, fromIndex, toIndex);
            }

SubList 这个类中单独定义了 set、get、size、add、remove 等方法。

当我们调用subList方法的时候,会通过调用SubList的构造函数创建一个SubList,

那么看下这个构造函数做了哪些事情。

                SubList(AbstractList<E> parent,
                        int offset, int fromIndex, int toIndex) {
                    this.parent = parent;
                    this.parentOffset = fromIndex;
                    this.offset = offset + fromIndex;
                    this.size = toIndex - fromIndex;
                    this.modCount = ArrayList.this.modCount;
                }

 

这个构造函数中把原来的 List 以及该 List 中的部分属性直接赋值给自己的一些属性了。

也就是说,SubList 并没有重新创建一个 List,而是直接引用了原有的 List(返回了父类的视图),

只是指定了一下他要使用的元素的范围而已(从 fromIndex(包含),到 toIndex(不包含))。

所以验证下调用sublist的set方法

        subList.set(0,"666");
        System.out.println(names);//[666, dao, de, cheng, xv, yuan]

使用sublist的set等方法修改元素值时,发现原来的那个list的元素值也发生了改变,同理对sublist进行add操作时也是如此

如何创建新的sublist?

如果需要对sublist做出修改,又不想动原list,那么可以创建出sublist的一个拷贝。

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

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

相关文章

Customizable constraint systems for succinct arguments学习笔记(2)

微软研究中心Srinath Setty、a16z crypto research 和 Georgetown University Justin Thaler、Carnegie Mellon University Riad Wahby 20203年论文《Customizable constraint systems for succinct arguments》。 前序博客有&#xff1a; Customizable constraint systems f…

别小瞧,搬迁网络机房,讲究的可不少

大家好&#xff0c;我的网工朋友 最近围观咱们网工交流群&#xff0c;不少朋友提到机房搬迁这档子事&#xff0c;毕竟嘛&#xff0c;做到这方面项目的概率还是很高的。 别看机房搬迁很简单&#xff0c;其实可讲究了。 随着企业、单位的不断深入发展&#xff0c;机房搬迁&…

【正点原子STM32连载】 第二十六章 USMART调试组件实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十…

记录搭建hadoop集群的过程

Linux(CentOS-7.6-x64位)基础配置, 虚拟机平台VmWare15 CentOS-7.6-x64镜像下载&#xff1a; https://www.aliyundrive.com/s/72Xg449t6i8 提取码: 32rm VmVare15安装包下载带序列号&#xff1a;VmVare15安装包下载带激活序列号资源-CSDN文库 点击关闭&#xff0c;点击完成&…

NineData,稳定、高效的Redis数据同步解决方案

在 DB-Engines 网站的排名中&#xff0c;Redis 在 Key-value 存储的NoSQL领域连续霸榜多年&#xff0c;是目前最流行的键值对存储数据库&#xff0c;被广泛用于缓存、队列、实时分析等多种高并发的场景中。在生产环境中&#xff0c;我们会遇到对Redis进行版本升级和架构的扩缩容…

vue 自定义el-table穿梭框功能

一、需求描述&#xff1a;前段时间接到一个需求是点击做一个类似穿梭框的表格点击选中功能&#xff0c;弹框的左边是全部数据展示&#xff0c;点击表格行数据可以选中自动增加到右边的已选框&#xff0c;并且可以手动删除、重置选中数据。点击确定后到展示到主页面&#xff0c;…

深入理解Linux虚拟内存管理(四)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核&#xff08;一&#xff09; 深入理解 Linux 内核&#xff08;二&#xff09; Linux 设备驱动程序&#xff08;一&#xff09; Linux 设备驱动程序&#xff08;二&#xff09; Linux 设备驱动程序&#xff08;三&#xf…

精选一线企业最佳生产实践,《Apache Doris 用户案例集》重磅发布!

过去的一年势必是 Apache Doris 在发展历程中有着浓墨重彩的一年&#xff0c;凭借对技术创新的执着与用户体验的追求&#xff0c;Apache Doris 已俘获全球范围内超过 2000 家企业的认可&#xff0c;拥有了极为广泛的用户规模、在企业实时数据分析的多种场景中得到广泛应用&…

热门AI通用大模型对比盘点(附论文)

今天我来和大家聊聊通用大模型&#xff0c;垂直领域大模型等整理完了再和大家分享。大家可以先关注一下我&#xff0c;有更新可以立马看见。 本文文末有整理好的通用大模型论文&#xff0c;都是各个大模型的原始论文&#xff0c;强烈建议大模型方向的同学&#xff0c;或者对大…

突破软件交付不可能三角,企业级无代码如何实现卓越交付?

一、VUCA时代下项目交付面临的困境 软件开发或软件项目交付一直以来都存在着“不可能三角”&#xff0c;即成本、效率和质量三者难以兼得。 交付周期长、成本高、满意度低等一直是行业内长期存在的现象&#xff0c;甚至软件交付双方都习以为常。传统项目管理与软件实施过程难…

Niagara—— Texture Sample 与 Particle Subuv 区别

一&#xff0c;Texture Sample 此节点是最基本的采样节点&#xff0c;依据UV坐标来采样Texture&#xff1b; MipValueMode&#xff0c;设置采样的Mipmap Level&#xff1b; None&#xff0c;根据当前Texture大小和物理缩放&#xff0c;自动选择合适的 Mipmap Level &#xff1b…

行为型设计模式03-观察者模式

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;猫十二懿 &#x1f3e1;账号&#xff1a;CSDN 、个人博客 、Github &#x1f38a;公众号&#xff1a;猫十二懿 观察者模式 1、观察者模式介绍 观察者模式是一种行为型设计模式&#xff0c;也被称为发布-订阅模式&#xff0c;它定…

Hive学习---4、函数(单行函数、高级聚合函数、炸裂函数、窗口函数)

1、函数 1.1 函数简介 Hive会将常用的逻辑封装成函数给用户进行使用&#xff0c;类似java中的函数。 好处&#xff1a;避免用户反复写逻辑&#xff0c;可以直接拿来使用 重点&#xff1a;用户需要知道函数叫什么&#xff0c;能做什么 Hive提供了大量的内置函数&#xff0c;按…

《相信》读后感

近日阅读了蔡磊的《相信》一书&#xff0c;蔡磊先生曾是京东集团副总裁&#xff0c;中国电子发票的推动者。上天给了他优越的智商条件&#xff0c;从上学到工作&#xff0c;前半生几乎顺风顺水、获誉无数&#xff0c;却在初为人父、本该享受家庭幸福的时候&#xff0c;接到突患…

Python字典及用法详解

Python中的字典&#xff08;Dictionary&#xff09;是一种无序、可变的数据类型&#xff0c;用于存储键&#xff08;Key&#xff09;和值&#xff08;Value&#xff09;之间的映射关系。字典是一种高效的数据结构&#xff0c;可以用于快速查找和检索数据。 1.创建字典 可以使…

MobileViT详解:轻型,通用,移动友好的视觉变压器

MobileViT详解&#xff1a;轻型&#xff0c;通用&#xff0c;移动友好的视觉变压器 0. 引言1. 网络结构2. 模型详解2.1 MobileViT Block2.1.1 Local representations2.1.2 Transformers as Convolutions (global representations)2.1.3 Fusion 2.2 MV2 3. 简化版理解4. 总结 0.…

Ubuntu系统搭建FTP服务器

Ubuntu 系统版本&#xff1a;Ubuntu 22.04.2 LTS 安装 vsftpd 软件包 sudo apt-get update sudo apt-get install vsftpd查看版本&#xff0c;验证是否安装成功&#xff1a;vsftpd -v 配置文件 以下是我翻译后的默认配置文件&#xff08;地址 /etc/vsftpd.conf&#xff09;&a…

[NOI2009] 描边

题目描述 小 Z 是一位杰出的数学家。聪明的他特别喜欢研究一些数学小问题。 有一天&#xff0c;他在一张纸上选择了 n 个点&#xff0c;并用铅笔将它们两两连接起来&#xff0c;构成 (&#xfffd;−1)22n(n−1)​ 条线段。由于铅笔很细&#xff0c;可以认为这些线段的宽度为…

ROS:参数的使用与编程方法

目录 一、参数模型二、 创建功能包三、参数命令行的使用(rosparam)四、使用程序来使用参数&#xff08;C&#xff09;4.1创建代码4.2编译4.3运行 一、参数模型 在ROS Master中&#xff0c;存在一个参数服务器&#xff08;Parameter Server&#xff09;&#xff0c;它是一个全局…

Python高光谱遥感数据处理与机器学习实践技术丨Matlab高光谱遥感数据处理与混合像元分解

目录 Python高光谱遥感数据处理与机器学习实践技术 第一章 高光谱基础 第二章 高光谱开发基础&#xff08;Python&#xff09; 第三章 高光谱机器学习技术&#xff08;python&#xff09; 第四章 典型案例操作实践 Matlab 高光谱遥感数据处理与混合像元分解 第一章 理论…