当前位置: 首页 > article >正文

设计模式:11、迭代器模式(游标)

目录

0、定义

1、迭代器模式的四种角色

2、迭代器模式的UML类图

3、示例代码

4、迭代器的next()方法与集合的get(int index)方法的效率对比(LinkedList为例)


0、定义

        提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

1、迭代器模式的四种角色

  • 集合(Aggregate):一个接口,规定了具体集合需实现的操作。
  • 具体集合(ConcreteAggregate):具体集合是实现集合接口的类的实例,具体集合按着一定结构存储对象。具体集合应当有一个方法,该方法返回一个针对该集合的具体迭代器
  • 迭代器(Iterator):一个接口,规定了遍历具体集合的方法,比如next()方法。
  • 具体迭代器(ConcreteIterator):实现迭代器接口的类的实例。具体迭代器在现实迭代器接口所规定的遍历集合的方法时,比如next()方法,要保证next()方法的首次调用将按着集合的数据结构找到该集合中的一个对象,而且每当找到集合中的一个对象,立刻根据该集合的存储结构得到待遍历的后继对象的引用,并保证依次调用next()方法可以遍历集合

2、迭代器模式的UML类图

3、示例代码

待设计……

4、迭代器的next()方法与集合的get(int index)方法的效率对比(LinkedList为例)

package xyz.jangle.list;

import java.util.Iterator;
import java.util.LinkedList;

public class ListMain {

	public static void main(String[] args) {
		LinkedList<String> list = new LinkedList<String>();
		for (int i = 0; i < 39999; i++) {
			list.add(""+i);
		}
		Iterator<String> iterator = list.iterator();
		long time1 = System.currentTimeMillis();
		
		while(iterator.hasNext()) {
			System.out.println(iterator.next());
		}
		long time2 = System.currentTimeMillis();

		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		long time3 = System.currentTimeMillis();
		
		System.out.println("Iterator:"+(time2-time1));
		System.out.println("For:"+(time3-time2));
		
	}

}

输出结果

Iterator:153
For:1855

总结:使用迭代器效率要比get方法快很多,数量越大,效果越明显。


http://www.kler.cn/a/412388.html

相关文章:

  • Springboot 实现Server-Sent Events
  • 爬虫开发(5)如何写一个CSDN热门榜爬虫小程序
  • Linux下一次性关闭多个同名进程
  • 前端-Git
  • 【MySQL】数据库核心技术与应用指南
  • 深度学习中的长短期记忆网络(LSTM)与自然语言处理
  • 修改IDEA配置导致Spring Boot项目读取application.properties中文乱码问题
  • SpringBoot(三十六)SpringBoot使用sentinel自定义注解实现限流
  • CodeIgniter URL结构
  • IntersectionObserver 交叉观察器
  • shell编程4,shell脚本于用户交互+关系运算符
  • C#基础题总结
  • 【大数据学习 | Spark-SQL】SparkSQL读写数据
  • STM32 使用ARM Compiler V6 编译裸机 LWIP协议栈报错的解决方法
  • 【pyspark学习从入门到精通21】机器学习库_4
  • 解决`-bash: ./configure:/bin/sh^M:解释器错误: 没有那个文件或目录`的问题
  • 项目学习:仿b站的视频网站项目03-注册功能
  • 沃丰科技出海客服系统:打造全球化客户服务新标杆
  • 日志打印规范
  • AVL、B树和B+树
  • 学习笔记039——SpringBoot整合Redis
  • width设置100vh但出现横向滚动条的问题
  • 速度革命:esbuild如何改变前端构建游戏 (1)
  • 多模态大模型打造沉浸式社交体验,Soul App创始人张璐团队海外首秀GITEX GLOBAL
  • 使用OpenCV实现图像拼接
  • 【C++第三方库】Muduo库结合ProtoBuf库搭建服务端和客户端的过程和源码