ArrayList中的迭代器

简介:

ArrayList需要遍历时,可以调用他的iterator()方法返回一个迭代器,然后用迭代器进行遍历。

ArrayList中的iterator:

public Iterator<E> iterator() {

returnnew Itr();

}

iterator()方法放回了一个Itr类实例,这个Itr类是ArrayList的一个内部类,实现了Iterator接口。

Itr源码如下:

/**

* An optimized version of AbstractList.Itr

*/

privateclass Itr implements Iterator<E> {

intcursor; // index of next element to return

intlastRet = -1; // index of last element returned; -1 if no such

intexpectedModCount = modCount;

publicboolean hasNext() {

returncursor != size;

}

@SuppressWarnings(“unchecked”)

public E next() {

checkForComodification();

inti = cursor;

if (i >= size)

thrownew NoSuchElementException();

Object[] elementData = ArrayList.this.elementData;

if (i >= elementData.length)

thrownew ConcurrentModificationException();

cursor = i + 1;

return (E) elementData[lastRet = i];

}

publicvoid remove() {

if (lastRet < 0)

thrownew IllegalStateException();

checkForComodification();

try {

ArrayList.this.remove(lastRet);

cursor = lastRet;

lastRet = -1;

expectedModCount = modCount;

} catch (IndexOutOfBoundsException ex) {

thrownew ConcurrentModificationException();

}

}

finalvoid checkForComodification() {

if (modCount != expectedModCount)

thrownew ConcurrentModificationException();

}

}

Itr类的三个成员变量。

cursor类似游标,指向迭代器下一个值的位置。

lastRet是迭代器最后一次取出的元素的位置。

expectedModCount的值为Itr初始化时候ArrayList的modCount的值。

modCount用于记录ArrayList内发生结构性改变的次数,而Itr每次进行next或remove的时候都会去检查expectedModCount值是否还和现在的modCount值,从而保证了迭代器和ArrayList内数据的一致性。

源码下载:

链接: http://pan.baidu.com/s/1pJK9jon

相关文章
|
API iOS开发
彻底搞懂同步与异步,阻塞/非阻塞
彻底搞懂同步与异步,阻塞/非阻塞
4223 0
|
7月前
|
存储 弹性计算 安全
2026年阿里云服务器2核8G可选实例规格、收费标准、适用场景及活动价格
阿里云2核8G配置服务器因性能均衡、成本适中,成为个人开发者、初创企业及中小型应用的优选。阿里云提供从经济型到企业级的多类实例,配合2026年最新活动政策,用户可灵活组合实现性能与成本的双重优化。文章详细解析了2核8G实例的规格、定价、典型应用场景及当前优惠,并给出不同场景下的选型指南与预算参考,助力用户技术选型与下单购买。
1597 3
|
Java API 开发者
Spring 控制反转与依赖注入:从玄学编程到科学管理
在传统开发中,手动`new`对象导致紧耦合、难以维护和测试。控制反转(IoC)将对象创建交给框架,实现解耦。Spring通过IOC容器自动管理对象生命周期,开发者只需声明依赖,无需关心创建细节。依赖注入(DI)是IoC的具体实现方式,支持构造器、Setter和字段注入。构造器注入推荐使用,保证依赖不可变且易于测试。对于多个同类型Bean,可用`@Qualifier`或`@Primary`解决冲突。此外,Spring还支持依赖查找(DL),开发者主动从容器获取Bean,适用于动态场景,但侵入性强。掌握IoC与DI,有助于构建灵活、可维护的Spring应用。
|
6月前
|
消息中间件 Oracle Java
Java EE已死?变成Jakarta EE了?一篇文讲清楚
你是否被Java SE、EE、ME和Jakarta EE绕晕?本文用“商业帝国”比喻厘清三者关系:SE是地基(必学核心),EE/Jakarta EE是大厦(企业级开发,现由Eclipse基金会维护),ME已成历史。Android用Java语法但非标准Java。
Java EE已死?变成Jakarta EE了?一篇文讲清楚
|
12月前
|
编解码 算法 调度
《URP管线主导的角色材质、阴影与显存动态适配优化方案》
本文聚焦手游URP管线角色渲染优化,针对多光源叠加材质失效、大规模同屏角色卡顿、显存过载闪退等核心问题,从Shader变体管理、动态光照阴影适配、粒子分层渲染、显存动态调度四大维度展开实战优化。通过构建“场景-功能”双维度变体筛选、“主次结合”混合光照架构、“核心-装饰-氛围”粒子体系及“纹理-材质-模型”显存优化体系,实现全链路协同适配。优化后,中端机型帧率稳定60帧,材质失效与闪退率大幅下降,角色渲染质感显著提升。
729 0
|
数据安全/隐私保护
IntelliJ IDEA使用技巧:在一个项目中如何正确引用其他子模块。
我希望这个解答可以帮助你,有了这些知识,你可以更好地使用IntelliJ IDEA并轻松处理项目中的子模块。
1245 19
|
Oracle 关系型数据库 Windows
如何彻底卸载 IDEA,将IDEA完全删除
本文提供了一个详细的教程,指导用户如何彻底卸载 IntelliJ IDEA,包括使用Uninstall.exe程序和通过注册表删除残留项的步骤。
12667 3
如何彻底卸载 IDEA,将IDEA完全删除
|
设计模式 人工智能 前端开发
像品茶一样品设计模式,早日突破编码新境界。
设计模式在日常开发中虽非必需,但对解决复杂问题、提升代码质量至关重要。通过多个实际场景的分析,如会员卡系统、代码评审和AI视频编辑器等,展示了设计模式的重要性。学习设计模式不仅能提高代码的可读性和扩展性,还能为框架源码阅读和面试提供支持。其核心目标是实现高复用和易扩展的应用程序,遵循封装、面向接口、组合优于继承等基本原则,并遵守SOLID原则。前端开发者应掌握单例模式、工厂模式、装饰器模式等经典设计模式,以应对不同项目需求。总结而言,设计模式是一把双刃剑,需根据具体问题灵活运用,适合项目环境的设计模式才是最好的。 (239字符)
|
开发框架 JavaScript 前端开发
描述JavaScript事件循环机制,并举例说明在游戏循环更新中的应用。
JavaScript的事件循环机制是单线程处理异步操作的关键,由调用栈、事件队列和Web APIs构成。调用栈执行函数,遇到异步操作时交给Web APIs,完成后回调函数进入事件队列。当调用栈空时,事件循环取队列中的任务执行。在游戏开发中,事件循环驱动游戏循环更新,包括输入处理、逻辑更新和渲染。示例代码展示了如何模拟游戏循环,实际开发中常用框架提供更高级别的抽象。
401 1
|
Web App开发
Chrome的插件扩展程序安装目录是什么?在哪个文件夹?
正常情况下,Chrome插件扩展程序的默认安装目录如下: 1.windows xp中chrome插件默认安装目录位置: C:\Documents and Settings\用户名\Local Settings\Application Data\Google\Chrome\User Data\Default\Extensions 2.
53188 2