子列表只是原列表的一个视图

原文参考:《编写高质量代码:改善java程序的151个建议》

本文原创:穆雄雄

上期文章:

subList?? subString???

上期我们说到,List接口提供了subList方法,其作用是返回一个列表的子列表。并且我们通过案例说明了一个问题,那便是,在原来的list集合基础上,调用subList产生新的List的时候,那么原来的list集合也会随之而改。

在看为什么之前,我们还是先从subList的源码上说起吧。

public List<E> subList(int fromIndex, int toIndex) {return (this instanceof RandomAccess ?new RandomAccessSubList<E>(this, fromIndex, toIndex) :new SubList<E>(this, fromIndex, toIndex));}

从代码中我们可以看到,instanceof的作用就是查看当前的对象是否是RandomAccess的实例,如果是,则调用RandomAccessSubList方法,否则调用SubList方法,况且进一步查看源码可以得知RandomAccessSubList类也继承至SubList类,所以我们直接来看SubList的源码:

class SubList<E> extends AbstractList<E> {private final AbstractList<E> l;private final int offset;private int size;SubList(AbstractList<E> list, int fromIndex, int toIndex) {if (fromIndex < 0)throw new IndexOutOfBoundsException("fromIndex = " + fromIndex);if (toIndex > list.size())throw new IndexOutOfBoundsException("toIndex = " + toIndex);if (fromIndex > toIndex)throw new IllegalArgumentException("fromIndex(" + fromIndex +") > toIndex(" + toIndex + ")");l = list;offset = fromIndex;size = toIndex - fromIndex;this.modCount = l.modCount;}}
//后面省略其他方法

通过阅读这段代码,我们就很清楚的知道SubList方法的实现原理,它返回的SubList类也是AbstractList的子类,其所有的方法如get、set、add、remove等都是在原始列表上的操作,它自身并没有生成一个数组或是链表,也就是子列表只是原列表的一个视图(View),所有的修改动作都反映在了原列表上。

所以我们表面上操作的是newList,其实操作的还是原来的列表。subList产生的列表只是一个视图,所有的修改动作直接作用于源列表。

往期精彩

“半路出家”的程序猿怎么不被“熊”

2020-10-11

某同学工作之后的感悟

2020-10-10

班级日常分享,一天一瞬间

2020-10-10

为了金秋那沉甸甸的麦穗,我绝不辜负春天

2020-10-09

subList?? subString???

2020-10-08

"爸妈没多大本事"……

2020-10-07

点分享

点点赞

点在看

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

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

相关文章

python注释的用法(单and多行)

单行注释 # name"asdfdasfdas"多行注释 """ print(xy) aad2"""快捷键 先选中要注释的内容然后Ctrl/

【2018.3.17】模拟赛之二-ssl1862jzoj1366 删数【区间dp】

正题 链接 需要纪中OJ账号 有n个数&#xff0c;可以选择删除一段区间&#xff0c;价值为|xi – xk|*(k-i1)。求删完所有数的最大价值 输入输出&#xff08;需要自取&#xff09; Input    输入文件的第一行为一个正整数N&#xff0c;第二行有N个用空格隔开的N个不同的正整…

ASP.NET Core之跨平台的实时性能监控

前言 前面我们聊了一下一个应用程序 应该监控的8个关键位置. 应用程序的8个关键性能指标以及测量方法 最后卖了个小关子,是关于如何监控ASP.NET Core的. 今天我们就来讲讲如何监控它,下面上效果图: 阅读本文需要了解的相关技术与内容: InfluxDb(分布式时序数据库,开源)(注…

EasyUI(前端框架)

第一节 EasyUI的介绍和常用组件 [1]EasyUI的介绍 介绍: EasyUI是一个前端开发的框架&#xff0c;其将常用的页面开发使用的组件进行了 封装&#xff0c;前端开发人员只需将EasyUI的资源导入项目后使用即可&#xff0c;快速 提升开发效率。 使用&#xff1a; ① 导入EasyUI的资…

如何快速开发一个 Dubbo 应用

转载自 如何快速开发一个 Dubbo 应用 导读&#xff1a;在分布式系统中&#xff0c;远程调用是最基础也是最重要的基石。历史上&#xff0c;曾经先后出现过 CORBA、RMI、EJB、WebService 等技术和规范&#xff0c;在服务化以及微服务日趋流行的今天&#xff0c;更多的被广泛使…

‘小会计’的转行之旅

本文原创&#xff1a;王哈哈1大学学习的专业是会计学&#xff0c;目前社会上来说很普遍的工作&#xff0c;都说会计是越老越吃香&#xff0c;所以一毕业就先找了一份和专业相关的工作&#xff0c;然后就开始了抱着公司的大腿努力工作。毕业三年期间也换了几份工作&#xff0c;本…

【2018.3.17】模拟赛之三-ssl1863jzoj1367 俄罗斯方块【模拟】

正题 链接 需要纪中OJ账号 有7种方块 有n列&#xff0c;给出每列的方块高度&#xff0c;求一种方块所有方面都落地的方案数 输入输出&#xff08;需要自取&#xff09; Input 第一行为二个整数C和P&#xff0c;1 ≤ C ≤ 100, 1 ≤ P ≤ 7&#xff0c;表示列数和下落方…

Python缩进的几个原则

Python的缩进有以下几个原则 顶级代码必须顶行写&#xff0c;即如果一行代码本身不依赖于任何条件&#xff0c;那它必须不能进行任何缩进 同一级别的代码&#xff0c;缩进必须一致 官方建议缩进用4个空格

应用程序的8个关键性能指标以及测量方法

前言 高性能一直是我们作为程序员..孜孜不倦的追求.. 有的时候甚至会为了一句代码吵上几天.. 那么到底应该如何评估我们的性能指标来判断是否需要优化呢? 今天就来讲一下这个.. 说明一下,本篇是译文. 原文地址:https://stackify.com/application-performance-metrics/ …

MyBatis Plus

文章目录第一节 MyBatis Plus 的简介第二节 MyBatis Plus 的框架搭建[1] 第一步&#xff1a;导包[2] 搭建SSM开发环境[3] 在数据库中创建测试表[4] 在pojo层下创建Student表的实体类[5] 在mapper层创建StudentMapper接口并继承BaseMapper接口[6] 创建测试类&#xff0c;并从Spr…

班级日常分享,一天一瞬间

119级日常分享经过两周左右的KTV项目终于要告一段落了&#xff0c;上午先让各个小组在班内试讲了下自己小组所做的KTV点歌系统&#xff0c;整体上做的还可以&#xff0c;有些小组还存在一些细节问题&#xff0c;在试讲的时候也都给他们指了指&#xff0c;相信下来会有所改进的。…

DDOS 攻击的防范教程

转载自 DDOS 攻击的防范教程 一个多月前&#xff0c;阮一峰的个人网站遭受 DDOS 攻击&#xff0c;下线了50多个小时。这篇文章就是他总结的&#xff0c;教大家如何应对这种攻击。 需要说明的是&#xff0c;我对 DDOS 并不精通&#xff0c;从没想过自己会成为攻击目标。攻击…

【2018.3.17】模拟赛之四-ssl1864jzoj1368 燃烧木棒【最短路,Floyd】

正题 链接 需要纪中OJ账号 有n条木棒&#xff0c;长度为1或根号2&#xff0c;给出每根木棒两头的坐标&#xff0c;和燃烧需要的时间。只能从一个木棒的一头开始点火&#xff0c;求燃烧完所有木棒所需要的最短时间。 输入输出&#xff08;需要自取&#xff09; Input 输入…

python变量的创建过程(内存地址变化)

​ name “Alex” 原因 python 解释器有自动垃圾回收机制&#xff0c;自动隔一段时间把没有跟变量名关联的内存数据回收。

推荐一份基于Docker的DevOps实战培训教程

01. 基于Docker的DevOps实战培训 微软工具链 基于Azure和Team Foundation Server 微软DevOps工具链是基于Visual Studio 应用生命周期管理&#xff08;VSALM - Visual Studio Application Lifecycle Managemnet&#xff09;的软件管理平台&#xff0c;本动手实验希望通过模拟一…

所有和Java中代理有关的知识点都在这了

转载自 所有和Java中代理有关的知识点都在这了 对于每一个Java开发来说&#xff0c;代理这个词或多或少都会听说过。你可能听到过的有代理模式、动态代理、反向代理等。那么&#xff0c;到底什么是代理&#xff0c;这么多代理又有什么区别呢。本文就来简要分析一下。 代理技…

神奇!一行代码实现删除某集合下标20-30的元素

大家好&#xff0c;我是雄雄。今天我们还是分享关于集合的内容。假如有这样的需求&#xff0c;已知集合的长度为100&#xff0c;也就是集合中有100个元素&#xff0c;现需要删除索引20-30之间的元素&#xff0c;我们应该怎么实现呢&#xff1f;我们先初始化集合&#xff0c;代码…

ssl初一组周六模拟赛【2018.3.17】

前言 先说一下成绩&#xff1a; 姓名成绩xjq(没错又是他)310hjq200hzb150wyc(本人)130lrz130xxy100lw30zyc缺考 正题 题目1&#xff1a;ssl2574 & jzoj1368 无限序列【斐波那契数列】 刚开始想用分治&#xff0c;结果做不出来&#xff0c;然后想到了更好的方法&#xff…

注意!在subList生成子列表之后,一定不要随便更改原列表

大家好&#xff0c;我是雄雄。前几期我们说过&#xff0c;subList方法是返回原列表的子列表&#xff0c;并且我们还说过&#xff0c;在subList返回的子列表上操作时&#xff0c;会直接影响着原列表&#xff0c;原文在这里&#xff1a;subList?? subString???子列表只是原列…

DotNetCore跨平台~Dockerfile的解释

大叔感觉网上对Dockerfile的说明不是很清楚&#xff0c;或者说怎么去用说的不清楚&#xff0c;在vs2017里我们可以去建立自己的Dockerfile文件&#xff0c;然后你的项目可以被生成一个镜像&#xff0c;把它推到仓库之后&#xff0c;你可以在linux,mac上去run你的项目了&#xf…