ArrayList分析2 :Itr、ListIterator以及SubList中的坑

迭代器模式:集合遍历的优雅实现与应用场景 迭代器模式是行为型设计模式中的经典实现,主要用于解耦集合对象的遍历逻辑与内部数据结构。该模式通过抽象迭代器接口(如hasNext()、next()等方法)实现统一访问机制,使客户端无需关心底层是数组、链表还是树形结构。从技术价值看,迭代器模式完美解决了集合遍历中的三大痛点:降低耦合度、支持多种遍历方式、隐藏复杂内部实现。在Java集合框架、数据库结果集遍历、大型文件处理等场景中都有广泛应用。现代编程语言如Java的Stream API、JavaScript的迭代协议、Kotlin的Sequence等,都在迭 阅读详情

一.不论ListIterator还是SubList,均是对ArrayList维护的数组进行操作

首先我得说下 ListIterator 是什么, ListIterator 与 Iterator 均是迭代器接口,对应 ArrayList 中的实现就是 ListItr 与 Itr ,我们使用 ListIterator 或 SubList 的过程中很少对ArrayList的操作,如果有那就很严重了(下面会说的),对源数组进行操作这是一个事实存在的问题:joy:,尤其在SubList表现的尤为严重~

先看看 ArrayList 的 subList 方法定义:

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

可以看到 subList 方法返回的是 SubList 的一个实例,好,继续看构造函数定义:

private class SubList extends AbstractList<E> implements RandomAccess {
        private final AbstractList<E> parent;
        private final int parentOffset;
        private final int offset;
        int size;
        // SubList构造函数的具体定义
        SubList(AbstractList<E> parent, int offset, int fromIndex, int toIndex) {
            // 从offset开始截取size个元素
            this.parent = parent;
            this.parentOffset = fromIndex;
            this.offset = offset + fromIndex;
            this.size = toIndex - fromIndex;
            this.modCount = ArrayList.this.modCount;
        }

首先我们要清楚的是 subList 对源数组( elementData )的取用范围 是 fromIndex <=取用范围< toIndex , 这里用 取用范围 其实很准确,接着看~ 因为 return new SubList(this, 0, fromIndex, toIndex); 对应构造函数的第一个参数 parent 其实也就是当前ArrayList的实例对象,这是其一,还有就是SubList的offset是默认的 offset+ fromIndex ,取用的范围就 size 限制在 toIndex - fromIndex; 以内,不管是 ArrayList 还是 SubList 对数组( elementData )的偏移操作,只不过一个是从0开始一个是从 offset + fromIndex; 开始~,如果你还是存在怀疑的话,先看看 SubList 中 get`方法:

public E get(int index) {
            rangeCheck(index);
            checkForComodification();
            return ArrayList.this.elementData(offset + index);
        }

看到没, get 方法也只直接取用的原数组( elementData )-> return
ArrayList.this.elementData(offset + index); ,很明白了吧,再看看 SubList 中 remove 方法论证下当前这个小标题哈~

public E remove(int index) {
            rangeCheck(index);
            checkForComodification();
            E result = parent.remove(parentOf
十.镜头知识之畸变问题 对于理想光学系统,在一对共轭的物像平面上,像的放大率是一个常数。但是对于实际的光学系统,当视场较大或很大时,像的放大率就要随视场而异,这样就会使像相对于物体失去相似性。这种使像变形的成像缺陷称为畸变。 阅读详情

相关推荐

[pytorch] MedicalNet 3D Resnet预训练模型迁移学习实战:从分割到分类的代码改造

本文详细介绍了如何利用PyTorch对MedicalNet 3D ResNet预训练模型进行迁移学习,从分割任务改造为分类任务。通过解析模型结构、调整分类头、加载预训练权重及优化训练策略,帮助开发者在医疗影像领域快速实现高效模型部署。文章还涵盖了数据预处理、增强技巧及模型轻量化等实用内容。

kmeans3miner的博客 245

用R语言做WGCNA分析全步骤一(附代码解读)【转载】

代码逐句分析一、文章来源二、基因共表达网络构建及模块识别1.数据导入、清洗及预处理2.检查过度缺失值和离群样本3.聚类做离群样本检测4.载入临床特征数据三、自动构建网络及识别模块1.确定合适的软阈值:网络拓扑分析2.一步构建网络和识别模块 一、文章来源 初学WGCNA,觉得博主的代码写的很不错,但其中很多代码在第一遍看的时候有很多地方不理解,后查阅了很多资料,终于看明白了,于是写了一篇笔记,记录自己的学习心得,有不准确的地方,还望各位大佬们不吝赐教~ 原文链接:WGCNA简明指南 二、基因共表达网络构建及模

qq_43138237的博客 2万+

Android 13高通平台CTS camera部分fail项修改(续)

接着上一篇,有几个提了case高通也分析了很久的fail项,其中最离谱的是问题1,第一个接手case的人反反复复处理、内部排查踢皮球、要求log,折腾了很久,最终就给出个解不了的结论。后面还是靠着自己发现了一些蛛丝马迹,并且换了个case接手人才最终解决。

hkj887tg的博客 2059

基于BS21的星闪模块设计电路SLE/BLE

基于BS21的星闪模块设计电路SLE/BLE HI2821

2503_91889531的博客 2737

Spring Boot Swagger未授权访问漏洞:原理、风险与修复方案详解

在微服务架构中,API文档管理是开发与运维的重要环节。Swagger作为RESTful API文档生成与调试的标准化工具,通过OpenAPI规范自动生成交互式接口文档,极大提升了开发效率。然而,其默认配置往往缺乏访问控制,导致文档端点直接暴露,形成未授权访问漏洞。从技术原理看,该漏洞源于Spring Boot等框架集成Swagger时,相关端点未纳入安全框架的拦截范围,攻击者可通过扫描常见路径获取完整的接口定义与数据结构。这不仅会造成敏感信息泄露,更可能成为越权操作、数据篡改等深度攻击的入口点。在工程实践中

weixin_42524171的博客 493

SAP FAGLFLEXT 是 SAP 新总账的核心余额表,存储多维度的汇总余额数据。核心结论:该表按 “科目 + 会计年度 + 期间 + 维度” 存储累计余额,字段可分为基础标识

FAGLFLEXT是SAP新总账的核心余额表,采用"科目+年度+期间+维度"结构存储多维汇总数据。其字段分为基础标识(科目、年度等)、维度细分(公司代码、利润中心等15个维度)、金额数值(本外币余额)、辅助控制(状态标识)四大类,支持新总账的灵活核算。该表通过凭证自动更新,与旧总账GLT0相比显著扩展了维度核算能力,各维度需在科目主数据或Ledger配置中启用才能使用。

金牌架构师 454

基于Simulink的永磁同步电机三闭环(位置/速度/电流)伺服仿真

本文详细介绍了基于Simulink的永磁同步电机三闭环伺服控制系统的设计与实现,针对机器人关节控制场景。系统采用位置环(外环)、速度环(中环)和电流环(内环)的嵌套结构,通过精确的带宽匹配(电流环1kHz、速度环200Hz、位置环20Hz)实现亚微米级位置跟踪。文中提供了完整的Simulink建模步骤,包括主电路搭建、三环PI控制器实现及坐标变换模块,并验证了系统性能:阶跃响应时间35ms,位置误差<0.05°,正弦跟踪误差<0.15°,负载突加恢复时间0.08s。最后提出了参数自适应整定、前馈

amy_mhd的博客 279

Boot过程相关镜像详解:IVT、DCD、App Boot镜像到底是什么?

S32系列芯片中常说的IVT镜像、DCD镜像等跟Boot过程相关的镜像到底是什么,镜像结构长啥样?各镜像作用是什么?主分区和备份区的概念?答案统统在这里!!

车载系统攻城狮 4251

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: Java岗史上最全八股文面试真题汇总,堪称2022年面试天花板
下一篇: 幸获内推,4面京东拿下offer(Java后台研发岗)地表最强
Java5658
博客等级 码龄4年 169粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值