迭代器(Iterator)模式

迭代器(Iterator)是一种设计模式。它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。在JAVA的Collection框架中已经实现,它提供了这几个接口方法:

/*
* @(#)Iterator.java 1.27 06/07/24
*
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package java.util;

public interface Iterator<E> {

boolean hasNext();

E next();

void remove();
}


package java.util;

public interface Collection<E> extends Iterable<E> {

Iterator<E> iterator();

//等等代码
}


这里可以看见,在Collection接口中是继承Iterable这个接口的。并且提供了一个Iterator<E> iterator();

我们继续看LIST容器接口:

package java.util;

public interface List<E> extends Collection<E> {

// .......
}


从这里可以看见,这个接口也是继承于Collection的,所以自然也就拿到了Iterable。以上都是接口,下面来看看实现类:


package java.util;
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
//..............
}


再看看AbstractList的实现类吧。

public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {


public Iterator<E> iterator() {
return new Itr();
}

//...............
}


终于找到这个iterator()方法了,看它实现了什么,return new Itr()?不要奇怪这种写法,这里的 private class Itr 是个内部类。


 private class Itr implements Iterator<E> {
/**
* Index of element to be returned by subsequent call to next.
*/
int cursor = 0;

/**
* Index of element returned by most recent call to next or
* previous. Reset to -1 if this element is deleted by a call
* to remove.
*/
int lastRet = -1;

/**
* The modCount value that the iterator believes that the backing
* List should have. If this expectation is violated, the iterator
* has detected concurrent modification.
*/
int expectedModCount = modCount;

public boolean hasNext() {
return cursor != size();
}

public E next() {
checkForComodification();
try {
E next = get(cursor);
lastRet = cursor++;
return next;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}

public void remove() {
if (lastRet == -1)
throw new IllegalStateException();
checkForComodification();

try {
AbstractList.this.remove(lastRet);
if (lastRet < cursor)
cursor--;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException e) {
throw new ConcurrentModificationException();
}
}

final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}

private class ListItr extends Itr implements ListIterator<E> {
ListItr(int index) {
cursor = index;
}

public boolean hasPrevious() {
return cursor != 0;
}

public E previous() {
checkForComodification();
try {
int i = cursor - 1;
E previous = get(i);
lastRet = cursor = i;
return previous;
} catch (IndexOutOfBoundsException e) {
checkForComodification();
throw new NoSuchElementException();
}
}

public int nextIndex() {
return cursor;
}

public int previousIndex() {
return cursor-1;
}

public void set(E e) {
if (lastRet == -1)
throw new IllegalStateException();
checkForComodification();

try {
AbstractList.this.set(lastRet, e);
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}

public void add(E e) {
checkForComodification();

try {
AbstractList.this.add(cursor++, e);
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
}



顺便来说说这个设计,很明显使用了策略模式,但是其中还使用了些抽象。

好了,看了原理,到这也就知道个大概了。也就不继续去深入下去了。我们来玩一下:

package moshi.iterator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class iter {



public static void main(String[] args) {
List list=new ArrayList();
list.add("a");
list.add("b");
list.add("c");
Iterator itr=list.iterator();
while(itr.hasNext()){
String str = (String) itr.next();
System.out.println(str);
}
}
}


PASS一下:这几个方法:hasNext()是否有下一个存在。next()下一个值。iterator()返回一个Iterator来使用。


当然,JAVA的强大何于满足一种WAY?看看下面的代码。

package moshi.iterator;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class iter {



public static void main(String[] args) {
List<String> list=new ArrayList();
list.add("a");
list.add("b");
list.add("c");

for(String newList:list){
System.out.println(newList);
}

}
}


[quote]输出:
a
b
c[/quote]


[quote]Iterator模式:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露内部的表示。因为JAVA内库中已经帮我们实现了,所以我们也就不要去实现Iterator了,但是记得要使用Collection容器框架哦。呵呵呵!看了这些继承,接口,实现乱七八糟的东西,您现在对Iterator还费解不?[/quote]
算法竞赛推荐书单 前言 入坑算法竞赛已经一年半了,在这期间也读了不少关于算法竞赛的书,这些书对我的帮助还是蛮大的。平时看题解多是个人零散的题解,很难以系统的去学习,认认真真的挑选1-2本书来阅读,无论是从思维能力还是文字表达能力都会得到提升,以下都是我自己读过的书进行一下分享,难度由浅入深,部分书籍浅尝而止。 入门:《啊哈!算法》 适合:总题量150以下初步掌握C语言的萌新 一本充满智慧和趣味的算法入门书。没有枯燥的描述,没有难懂的公式,一切以实际应用为出发点,通过幽默的语言配以可爱的插图来讲解算法。你更像是在阅读一个个轻松 阅读详情

相关推荐

嵌入式Linux Qt/QML开发实战:从Buildroot配置到应用部署

本文详细介绍了嵌入式Linux Qt/QML开发全流程,从Buildroot系统配置、交叉编译工具链搭建到应用部署与调试。以RK3506开发板为例,提供实战指南,帮助开发者高效完成嵌入式应用开发,解决常见环境配置与性能优化问题。

m2n3o4p5的博客 224

设计模式-迭代器模式(Iterator)

迭代器模式是一种设计模式,它用于提供一种方法来访问一个容器对象中的各个元素,而又不暴露该对象的内部表示。在迭代器模式中,我们定义一个抽象的迭代器类,它包含两个方法:一个是hasNext()方法,用于判断是否还有下一个元素;另一个是next()方法,用于获取下一个元素。然后,每个容器类都实现自己的迭代器类,以访问容器中的元素。

miaoyl的博客 2496

优快云余额充值前必读:这5个隐藏条款,90%的开发者都忽略了(附iOS内购避坑指南)

本文揭示了优快云余额充值中90%开发者忽略的5个隐藏条款,包括不可退款规则、iOS内购限制、账号安全责任等关键内容,特别提供了iOS内购避坑指南,帮助开发者避免资金损失和账号风险。

weixin_26765287的博客 147

设计模式1——Iterator迭代器模式

1. Iterator模式出现的目的 Iterator模式用于在数据集合中按照顺序遍历集合,客户端不需要维护遍历集合的“指针”,遍历的信息都交由Iterator处理。 每一种集合类型返回的Iterator具体类型可能不同,但是他们都实现了Iterator接口,因此客户端只需要得到Iterator接口就可以了,而不需要知道返回的具体是哪种Iterator接口。如:Array返回的是ArrayIt

想当厨子的程序媛 334

Modelsim安装教程以及管理员身份运行patch_dll.bat时找不到文件mgls.dll的解决

Modesim安装教程 Modesim版本有很多,但是安装方式大都相同,我们以modesim.10.5为例,电脑使用的是win10 64位,讲一下安装过程中的步骤以及出现问题的解决方法 一 安装 1.首先解压安装包,在解压的安装包内选择应用程序,右键选择管理员运行。 2.稍等一会,有的电脑会弹出是否允许modesim进行更改,选择 是 即可,然后出现下面的界面,点击下一步。 3.弹出此界面选择安装路径,选择安装路径,我是在D盘新建的文件夹,直接把文件夹中的路径复制在框内。文件夹名称切记不要带中文 4.

weixin_48564372的博客 1万+

芯片散热技术突破:多尺度结构与VC集成方案解析

在半导体技术快速发展的背景下,芯片散热成为制约性能提升的关键瓶颈。传统散热技术如风冷和水冷已接近物理极限,而两相浸没式液冷技术凭借其超高传热系数成为新的解决方案。通过多尺度表面结构设计与真空腔均热板(Vapor Chamber)的集成创新,可以显著提升沸腾性能,降低沸腾起始温差(ONB)并突破临界热流密度(CHF)限制。这种技术在数据中心、高性能计算(HPC)和边缘计算等高热流密度场景中具有重要应用价值,能有效提升能效比(PUE)并降低能耗。

weixin_36288992的博客 155

设计模式——Iterator(迭代器)模式

目录前言1 定义2 适用性3 结构3.1 结构图3.2 参与者4 Java应用举例4.1 Iterator4.2 Collection4.3 AbstractList5 总结参考文献 前言 一个聚合对象,如容器列表,应该提供一种方法让别人可以访问自己的元素,而又不暴露自己的内部结果。同时可能有不同的需求,需要提供不同的遍历过程。 1 定义 Iterator(迭代器)模式:提供一种方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部结构。 2 适用性 访问一个聚合对象的内部而不暴露内部结构。 支持对

qq_36566262的博客 574

HBuilderX结合Android Studio实现Uniapp安卓Apk高效离线打包指南

本文提供了一份详细的Uniapp安卓Apk离线打包实战指南。通过整合HBuilderX与Android Studio,手把手教你搭建本地编译环境、配置原生工程、执行核心打包流程,并分享快速更新资源和排查常见问题的技巧,助你彻底摆脱云端打包的排队依赖,实现高效、可控的应用构建。

weixin_28835551的博客 558

iterator迭代器模式

本文基本是搬运,搬运自网友k_eckel 的书籍《设计模式精讲-GoF 23种设计模式解析附C++实现源码》

刀法孜然的博客 584

TMS320F28377D的sys/bios双核工程配置详解——从零搭建到RAM优化

本文详细解析了TMS320F28377D双核系统在sys/bios环境下的工程配置与RAM优化策略。从开发环境搭建、SYS/BIOS工程创建到双核CMD文件配置,提供了实战技巧和常见问题解决方案,帮助开发者高效实现电力电子控制系统中的双核协作与性能优化。

weixin_28292761的博客 600

稀疏阵列选型指南:互质阵、嵌套阵、MRA,谁才是你项目里的‘性价比之王’?

本文深入探讨了稀疏阵列技术中的互质阵、嵌套阵和MRA三大架构的工程化选型策略,重点分析了它们在DOA估计、自由度、旁瓣抑制和计算复杂度等核心指标上的表现。通过实际案例和配置示例,为智能天线、声学定位和毫米波雷达等应用场景提供技术选型指南,帮助研发团队在硬件成本与性能之间找到最佳平衡点。

weixin_42525005的博客 488

JAVA设计模式之 迭代器模式【Iterator Pattern】

一、概述     提供一种方法来访问聚合对象(容器container),而不用暴露这个对象的内部细节。 二、适用场景     1>遍历访问聚合对象中的元素,而无须暴露它的内容表示,将聚合对象的访问和内部数据的存储分离。使得访问聚合对象时无须了解其内部的实现细节。     2>需要为一个聚合对象提供多种遍历实现。 三、UML类图 四、参与者  1>Ite

小吕丶Code阶区 1941

Windows系统下com0com虚拟串口安装与驱动签名禁用全攻略

本文详细介绍了在Windows系统下安装com0com虚拟串口工具的全过程,包括驱动签名问题的解决方法。通过禁用驱动程序强制签名,用户可以顺利安装并使用这款开源工具创建虚拟串口对,适用于软件开发测试、硬件调试等场景。文章还提供了验证虚拟串口功能的实用技巧和常见问题解决方案。

weixin_28720573的博客 386

23种设计模式-迭代器(Iterator)模式

迭代器(Iterator)模式,又叫做游标(Cursor)模式。GOF给出的定义为:提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。迭代器接口Iterator:该接口必须定义实现迭代功能的最小定义方法集比如提供hasNext()和next()方法。迭代器实现类ConcreteIterator:迭代器接口Iterator的实现类。可以根据具体情况加以实现。容器接口Aggregate:定义基本功能以及提供类似Iterator iterator()的方法。

陈立的博客 1043

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Java设计模式之 Iterator 迭代器模式

Java设计模式之 Iterator 迭代器模式 设计模式本身就是一门玄学,看不懂很正常,一次看懂就不是很正常了,多看多练才是关键 int [] array = {1 , 2 , 3 , 4 , 5 , 6}; for(int i = 0;i < array.length;i++) { System.out.println(array[i]); } 看这个代码是不是平平无奇,是的,它就是平平无奇的遍历和输出而已,其中变量 i 的作用就是确定当前对数组的索引,然后将这里的循环变量i的作用抽象化

qq_45108095的博客 262

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

设计模式-Iterator(迭代器)模式

·设计模式篇均为读《图解设计模式》学习记录 迭代器模式,见名知意,遍历一个集合中的元素, 下面让我们看看我们常用的数组遍历 for(int i = 0; i &lt; arr.length; i++) { System.out.println(arr[i]); } 那么使用迭代器的遍历应该怎么做呢? 先让我们看一下迭代器模式的类图: Aggregate 这个词是集合的意思...

zhanjunpeng01的博客 271

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Iterator Pattern迭代器模式

Iterator Pattern迭代器模式:首先了解两个接口:1. Iterable接口:实现该接口的集合对象是可迭代遍历的public interface Iterable&lt;T&gt; {    ...    Iterator&lt;T&gt; iterator();}2.Iterator接口:迭代器public interface Iterator&lt;E&gt; {    boole...

zqxhit1234的博客 291

迭代器模式 Iterator

迭代器模式就是一种顺序访问对象元素的方法。例如在我们遍历数组arr时,可以使用for循环进行遍历i ++) {在这段代码中,循环遍历为i,每次通过i++向下递增,指向下一个元素。通过对循环变量i的抽象,形成的一种行为模式,就是迭代器模式。定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示结构迭代器模式主要包含以下角色。Aggregate(抽象集合)角色:定义interator()方法,创建Interator对象。

qq_65348015的博客 133

【设计模式】17、iterator 迭代器模式

为了集合数据的安全性, 或方便迭代, 可以用迭代器接口. 屏蔽复杂的内部逻辑, 外部只能使用迭代器遍历

呆呆的猫的博客 825

Java设计模式-迭代器模式Iterator

根据GoF的定义,迭代器模式提供了一种顺序访问聚合对象的元素而不暴露其底层表示的方法。这是一种行为设计模式。顾名思义,迭代器有助于以定义的方式遍历对象集合,这对客户端应用程序很有用。在迭代期间,客户端程序可以根据需求对元素执行各种其他操作。

老徐的博客只有干货 857

迭代器模式与Java Iterator源码

迭代器模式 迭代器模式是一种将集合的增删改操作与集合的顺序遍历操作分离的设计模式。集合只负责增删改操作,迭代器对于集合的内部类,专门负责顺序遍历。Java的Iterator是迭代器模式的经典实现。笔者jdk版本是11.0.4,不同版本的jdk的Iterator相关类及其实现有所不同,下面以jdk11.0.4为例。 Iterator jdk定义了一个Iterator接口,声明了hasNext, ne...

da_kao_la的博客 354

重学设计模式-Iterator(迭代器模式)

通过以上两个实例,在每个实例中,都出现了相对重要的接口和实现类,这四个关键角色,分别是Iterator(迭代器)、ConcreteIterator(具体的迭代器)、Aggregate(聚合对象)和ConcreteAggregate(具体的聚合对象)。Iterator(迭代器)Iterator是一个接口,它定义了在集合对象上进行迭代的方法hasNext()用于检查是否还有下一个元素next()用于获取下一个元素。ConcreteIterator(具体的迭代器)

胖胖爱吃肉~的博客 1327

1、迭代器 Iterator模式 一个一个遍历 行为型设计模式

1、Iterator模式 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或者阵列)上遍访的接口,设计人员无需关心容器的内容。 Iterator模式 - 一个一个遍历,我们将学习从含有多个元素的集合中将各个元素逐一取出来的iterator模式。 导学 对于数组我们使用的是下标来进行处理的: 1intarray[]=ne...

qq_42390636的博客 263

PHP迭代器模式(Iterator Pattern)

迭代器模式(Iterator Pattern)是一种常用的设计模式,用于遍历集合中的元素,不暴露集合的内部结构。迭代器模式将集合和遍历分离,使得集合和遍历可以独立地变化。以上就是PHP中迭代器模式的简单介绍,希望对你有所帮助。PHP中的迭代器模式主要是通过实现。表示当前遍历的位置。以上代码中,我们定义了一个。数组表示要遍历的集合,接口的所有方法,其中。

php-yyds 510

初识设计模式——迭代器模式(PHP中迭代器(Iterator)的使用)

初始迭代器模式 迭代器模式提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。在《大话设计模式》中提到,此设计模式实用价值远不如学习价值大了,martin flower甚至提出撤销此设计模式。另外,无论是JAVA、Python,亦或是PHP中,都存在多种多样的遍历聚合元素的方式,所以此处就不过多的去了解了。这里我主要记录的是自己对PHP迭代器Iterator的抽象类的使用...

来自一个小码农的记录 598

设计模式-迭代器模式(Iterator)

概述 定义 : 提供一种方法, 顺序访问一个集合对象中的各个元素, 而又不暴露该对象的内部表示 类型 : 行为型 适用场景 访问一个集合对象的内容而无需暴露它的内部表示 为遍历不同的集合结构提供一个统一的接口 优点 分离了集合对象的遍历行为 缺点 类的个数成对增加 模式角色 Iterator(迭代器) : 迭代器定义访问和遍历元素的接口。 ConcreteIterator(具体...

听雪楼 324
上一篇: 使用Facade(外观)模式改善现有软件设计—混乱变简单
下一篇: Servlet 线程问题与解决方案
NationSoftware
博客等级 码龄18年 2粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值