【Java集合类】ArrayList

方法

subList(int fromIndex, int toIndex)

可以看一下subList源码片段
在这里插入图片描述

public List<E> subList(int fromIndex, int toIndex) {subListRangeCheck(fromIndex, toIndex, size);return new SubList<>(this, fromIndex, toIndex);}
private static class SubList<E> extends AbstractList<E> implements RandomAccess{
...
}

可以看一下继承关系。
在这里插入图片描述
可以得到以下几个关键信息:

  1. subList返回的是一个SubList类型的对象
  2. 对原list和新list做非结构性修改都会影响到彼此
  3. 对原list做非结构性修改,会报错

验证:对原list和新list做非结构性修改都会影响到彼此

    public static void main(String[] args) {ArrayList old_list = new ArrayList();old_list.add("1"); old_list.add("1"); old_list.add("1"); old_list.add("1"); old_list.add("1");List new_list = old_list.subList(1, 3);System.out.println("原list = " + old_list.toString() + "新list = " + new_list.toString());old_list.set(2, "hh"); // 对原list进行非结构性修改System.out.println("原list = " + old_list.toString() + "新list = " + new_list.toString());new_list.set(0, "xx");// 对新list进行非结构性修改System.out.println("原list = " + old_list.toString() + "新list = " + new_list.toString());}

输出:

原list = [1, 1, 1, 1, 1]新list = [1, 1]
原list = [1, 1, hh, 1, 1]新list = [1, hh]
原list = [1, xx, hh, 1, 1]新list = [xx, hh]

验证:对原list做结构性修改,会报错

    public static void main(String[] args) {ArrayList old_list = new ArrayList();old_list.add("1"); old_list.add("1"); old_list.add("1"); old_list.add("1"); old_list.add("1");List new_list = old_list.subList(1, 3);System.out.println("原list = " + old_list.toString() + "新list = " + new_list.toString());old_list.add(5);System.out.println("原list = " + old_list.toString() + "新list = " + new_list.toString());}

输出:

原list = [1, 1, 1, 1, 1]新list = [1, 1]
Exception in thread "main" java.util.ConcurrentModificationExceptionat java.base/java.util.ArrayList$SubList.checkForComodification(ArrayList.java:1415)at java.base/java.util.ArrayList$SubList.listIterator(ArrayList.java:1284)at java.base/java.util.AbstractList.listIterator(AbstractList.java:311)at java.base/java.util.ArrayList$SubList.iterator(ArrayList.java:1280)at java.base/java.util.AbstractCollection.toString(AbstractCollection.java:449)at com.example.sprint_test01.TestArrayList.main(TestArrayList.java:22)

为什么呢?看一下源码,在jdk注释里有这么一段话:

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.

意思就是说,subList方法返回的是一个视图,可以理解为一个映射窗口,fromIndextoIndex理解为窗口的边界,我们就可以到这个边界内的元素,当内部元素改变的时候,我们看到的也就变了,理解为一个引用。

    public List<E> subList(int fromIndex, int toIndex) {subListRangeCheck(fromIndex, toIndex, size);return new SubList<>(this, fromIndex, toIndex);}private static class SubList<E> extends AbstractList<E> implements RandomAccess {private final ArrayList<E> root;private final SubList<E> parent;private final int offset;private int size;/*** Constructs a sublist of an arbitrary ArrayList.*/public SubList(ArrayList<E> root, int fromIndex, int toIndex) {this.root = root;this.parent = null;this.offset = fromIndex;this.size = toIndex - fromIndex;this.modCount = root.modCount;}/*** Constructs a sublist of another SubList.*/private SubList(SubList<E> parent, int fromIndex, int toIndex) {this.root = parent.root;this.parent = parent;this.offset = parent.offset + fromIndex;this.size = toIndex - fromIndex;this.modCount = parent.modCount;}

可以看到,调用subList方法的时候,我们用的其实就是引用的原有的list,并规定了边界。
同时可以看到为什么subList得到的集合不能转换为ArrayList,因为SubList只是ArrayList的内部类,与其并没有继承关系。

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

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

相关文章

Power BI可视化表格矩阵如何保持样式导出数据?

故事背景&#xff1a; 有朋友留言询问&#xff1a;自己从Power BI可视化矩阵表格中导出数据时&#xff0c;导出的表格样式会发生改变&#xff0c;需要线下再手动调整&#xff0c;重新进行透视组合成自己想要的格式。 有没有什么办法让表格导出来跟可视化一样&#xff1f; Po…

解析Kotlin中的内联函数,inline、noinline、crossinline【笔记摘要】

用编译时常量的概念&#xff0c;引出本文要讲内联函数inline&#xff1a; 1.编译时常量 Java的编译时常量 Compile-time Constant 它有四个要求&#xff1a;1.这个变量需要是 final 的  2.类型只能是字符串或者基本类型  3.这个变量需要在声明的时候就赋值  4.等号右边…

git提交实战

以新项目为例&#xff0c;如何在新项目新分支提交代码。 1.查看文件所在位置 git init 2.克隆项目到本地并完成身份配置 3.将需要新增的文件放到指定目录路径下 4.进入新克隆的文件 cd XXX 5.切换分支 git checkout XXX 6.标红者即为新提交的文件 git status 7.加入 git …

Java_多线程:线程池

1、线程池优点&#xff1a; 降低资源消耗&#xff1a;通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度&#xff1a;当任务到达时&#xff0c;任务可以不需要等到线程创建就能立即执行。提高线程的可管理性&#xff1a;线程是稀缺资源&#xff0c;如果无限…

泰雷茲具有首个通过FIPS 140-3 三级认证的HSMs

泰雷兹LunaHsm是业界首款通过FIPS140-33级认证的解决方案&#xff0c;安策引进泰雷兹HSM产品可以帮助您满足您的数据安全合规性需求&#xff0c;阻力企业提高竞争力。 安策提供泰雷茲ThalesLunaHSMs成为首个通过FIPS140-3三级认证的硬件安全模块图 我们很高兴地宣布&#xff0c…

面试题 1:阐述Python:except的用法和作用?

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

微软关闭中国所有线下店,并不影响全球第一

​关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 微软没有被时代淘汰&#xff0c;时代也没有告别微软!中国市场对微软可有可无&#xff0c;即便没有中国市场&#xff0c;微软市值也在全球前三&#xff0c;这是事实!a 5月中旬&#xff0c;微软azure解散中国分部…

mindspore打卡机器学习正则化与优化器

机器学习正则化 这段代码实现了一个深度学习实验&#xff0c;目的是使用不同的正则化技术&#xff08;包括dropout、批量归一化、L2正则化以及早期停止策略&#xff09;来训练神经网络模型&#xff0c;以拟合一个带有噪声的余弦波形数据集。代码使用MindSpore框架进行编写&…

分享六款免费u盘数据恢复工具,U盘恢复工具集合【工具篇】

U盘里面的数据丢失了怎么找回&#xff1f;随着数字化时代的深入发展&#xff0c;U盘已成为我们日常生活中不可或缺的数据存储工具。然而&#xff0c;由于各种原因&#xff0c;如误删除、格式化、病毒攻击等&#xff0c;U盘中的数据可能会丢失&#xff0c;给用户带来极大的困扰。…

加装德国进口高精度主轴 智能手机壳「高质量高效率」钻孔铣槽

在当前高度智能化的社会背景下&#xff0c;智能手机早已成为人们生活、工作的必备品&#xff0c;智能手机壳作市场需求量巨大。智能手机壳的加工过程涉及多个环节&#xff0c;包括钻孔和铣槽等。钻孔要求精度高、孔位准确&#xff0c;而铣槽则需要保证槽位规整、深度适宜。这些…

IDEA中SpringBoot项目数据库连接加密方法

1. maven添加相应版本的依赖 这里注意&#xff0c;不能使用太新的版本&#xff0c;本人开发环境使用3.0.3版本时&#xff0c;报以下错误&#xff0c;使用2.1.2时报错消失。 *************************** APPLICATION FAILED TO START ***************************Description:…

【Ubuntu】Ubuntu系统的127.0.1.1有什么用

参考Debian参考手册,Debian/Ubuntu系统下/etc/hosts内定义的127.0.1.1 IP为本机回环地址。 对于有静态IP地址的系统,应用静态IP替代这里的127.0.1.1. Debian参考手册部分截取: 5.1.1. 主机名解析 主机名解析,目前也是由 NSS (名字服务转换 Name Service Switch) 机制来支…

Yarn Scripts自动化:高效运行JavaScript任务的指南

引言 Yarn是一个现代的包管理工具&#xff0c;它不仅提供了快速可靠的包安装机制&#xff0c;还内置了一个强大的脚本运行工具。通过Yarn的脚本功能&#xff0c;开发者可以自动化执行各种任务&#xff0c;如测试、构建、清理等。本文将详细介绍如何使用Yarn的脚本运行工具来提…

Python容器 之 字典--字典的常用操作方法

1.增加和修改 字典[键] 值 键 存在, 修改 键 不存在, 添加 # 定义非空字典, 姓名, 年龄, 身高, 性别 my_dict {"name": "小明", "age": 18, "height": 1.78, "isMen": True} print(my_dict) # {name: 小明, age: 18, h…

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务4:安装并配置JDK

任务描述 Hadoop 2.8需要JDK 1.6及以上版本的JDK&#xff0c;建议安装JDK 1.8&#xff0c;如果Cent OS是最小化安装&#xff0c;可能没有Open JDK&#xff0c;即使已经安装过Open JDK也可以使用JDK 1.8替换系统自带的Open JDK。 任务的内容为检查各个节点的JDK的安装情况&…

企业如何管理安全生产工作?(附模板)

总结一下在企业内管理安全中遇到的一些问题&#xff1a; 1、 管理方式落后&#xff0c;还在使用纸质记录 2、 人员信息杂乱无章&#xff0c;无人整理 3、出现问题找不到源头和负责人 我做系统管理已经7年了&#xff0c;题主说的这些问题我之前也遇到过&#xff0c;相信也有…

API接口测试/Swgger-ui未授权访问

目录 API接口 接口文档 接口测试的方法 单流程 多流程 Swgger-ui未授权访问 在之间的一次面试中面试官问到了API接口测试&#xff0c;我回答的不好&#xff0c;因为自己确实不太会&#xff0c;后面才下去学习了&#xff0c;这里复习和练习一下 API接口 API&#xff08;…

自下而上的选股与自上而下的选股

一起学习了《战胜华尔街》&#xff0c;不知道大家有没有这么一种感受&#xff1a;林奇的选股方法是典型的自下而上的选股方法。虽然这一点没有单独拎出来讨论过&#xff0c;但在《从低迷中寻找卓越》《如何通过财务指标筛选股票&#xff1f;》《边逛街边选股&#xff1f;》《好…

拓扑学习系列(6)pq环面结实与卫星结实

(p, q)-torus knots (p, q)-torus knots 是一类特殊的结实&#xff0c;它们可以通过在环面&#xff08;torus&#xff09;上进行 p 次纵向绕线和 q 次横向绕线来构造。Trichotomy 是指将 (p, q)-torus knots 分为三类&#xff1a;可解的&#xff08;solvable&#xff09;、非可…

ANSYS新能源汽车动力电池仿真应用案例

燃料电池是一种非燃烧过程的电化学能转换装置&#xff0c;将氢气&#xff08;等燃料&#xff09;和氧气的化学能连续不断地转换为电能&#xff0c;是发电设备而非储能设备。 根据电解质的不同&#xff0c;分为碱性燃料电池AFC、磷酸燃料电池PAFC、熔融碳酸盐燃料电池MCFC、固体…