【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解散中国分部…

分享六款免费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:…

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

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

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

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

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

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

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

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

解析商场智能导视系统背后的科技:AR导航与大数据如何助力商业运营

在布局复杂的大型商场中&#xff0c;顾客常常面临寻找特定店铺的挑战。商场的规模庞大&#xff0c;店铺众多&#xff0c;使得顾客在享受购物乐趣的同时&#xff0c;也不得不面对寻路的难题。维小帮商场智能导航导视系统的电子地图、AR导航营销能为顾客提供更加便捷的购物体验。…

震惊!张宇强化36讲1200页,暑期强化高效利用指南!

特别喜欢张宇老师的讲课风格 如果你打算跟张宇老师&#xff0c;那么基础——>强化——>冲刺&#xff0c;你应该这么买书&#xff01; 张宇老师25版课程大改版&#xff0c;其中&#xff0c;36讲的变动是最大的&#xff0c;张宇老师25版课程把以往的强化课程前移&#xff0…

spark on k8s两种方式的原理与对比

spark on k8s两种方式的原理与对比 1、spark on k8s 方式 spark-submit可以直接用来向 Kubernetes 集群提交 Spark 应用&#xff0c;提交机制如下&#xff1a; 1、Spark 创建一个在Kubernetes pod中运行的 Spark 驱动程序。 2、驱动程序创建在 Kubernetes Pod 中运行的执行器…

01 Docker 概述

目录 1.Docker简介 2.传统虚拟机 vs 容器 3.Docker运行速度快的原因 4.Docker基本组成三要素 5.Docker 平台架构 入门版 架构版 1.Docker简介 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是&#xff1a;Build, Ship and Run Any App, Anywhere&#xff0c…

我不小心把生产的数据改错了!同事帮我用MySQL的BinLog挽回了罚款

之前在生产做修改数据的时候不小心改错了一行数据&#xff0c;本来以为会被通报批评&#xff0c;但是同事利用binlog日志查看到了之前的旧数据&#xff0c;并且帮我回滚了&#xff0c;学到了&#xff0c;所以写了一篇binlog的文章分享给大家。 MySQL的Binary Log&#xff08;简…

Java--Map集合

Map 映射(map)是存储键和值间关联(即&#xff0c;键值对)的对象。给定一个键&#xff0c;可以找到其值。键和值都是对象。键必须唯一&#xff0c;但是值可以重复。 支持映射的接口 接 口 描 述 Map 将唯一键映射到值 NavigableMap 扩展SortedMap接口&#xff0c;以处理…