-
关于Iterator模式 5
JAVA COLLECTION类都提供Iterator模式来迭代的取数据,比如ArrayList最终实现Iterable接口,但是
(一)
for(int i=0,i<size;i++){
a.get(i);
......
}
(二)
Iterator i = a.inerator();
while(i.hasNext()){
......
}
1和2都能遍历list实例a的所有元素,没看出用iterator有什么优势。
起先我的想法就是Iterator提供了List的一个不可变视图,如果你想把List发布给一个方法查看而又不希望这个方法能修改它,则发给给该方法一个List的不可更改视图,但是这个想法有几个问题:
(1)Iterator并非不可改,有remove方法
(2)如果是发布不可变试图的话完全可以用Collections.unmodifyList(a);
(3)如果仅仅是发布不可变视图的话也未必要是Iterator这个形式,试想一下,一个方法的参数是Iterator将是多么晦涩难理解的,我也没见过这个用的。
我的第二个想法是Iterable接口是所有Collection对象都必实现的,也许在List里体现不出优势,在其他集合类里能体现出来,List实现Iterable只是List作为集合类所顺理成章实现的。
到底Iterator的优势在哪里
问题补充:
根据一楼回答,好像是那么个意思。
问题补充:
根据eyeqq的阐述,突然产生疑问:
如果是封装变化的话,我完全可以将get方法加入到最底层的接口Collection中,这样所有实现Collection的集合类都可以用get(i)遍历元素,但是JAVA集合类最底层却是Iterator接口
问题补充:
我已经看过不少设计模式的资料,根据各位叙述,是不是可以将Iterator总结如下:
定义一个接口,当所有实现类都有同样类似的行为,但是这个行为具体做起来又有差异,比如所有集合都有取元素的行为,但是list可以顺序用get方法+序号取值;但是SET集合本身是乱序的,无法用get方法+序号取值,那么可以抽象出一种新的封装类型,将这种共有但是存在差异(有可能是方法不同,也有可能是相同方法参数不同)的行为委派给这个新的封装类型,让其代替作这件事。这是ITERATOR的精髓。
但是这确实比较少见,而且一个方法只接受Collection作为参数也很少见
问题补充:
我觉得CollectionFramework中存在两级抽象,Collection一级,List,Map,Set一级常用的是第二级,比如使用List作为参数,那么get方法就生效了,通过get能遍历任何List了,但是如果用Collection级抽象,有可能传List也有可能传Map,但是List和Map的数据操作截然不同,我在想再编写代码的时候是应该通过接口提供灵活性,但是总归有一层是需要具体的,数据结构是程序运行根本,总不至于连List和Map都要提供统一抽象吧,其他层次不变性不好说,保证一个程序数据结构不变还是可以做到的阿。
问题补充:
在延伸一下这个问题,我开始同意大家说的了,Iterator作为通过Collection访问所有list ,set元素的统一方法,那么仍然没有阐述叠代器的精髓,为什么返回的要是一个叠代器,访问下一个元素,状态改变,就无法访问上一个元素呢?我是说作为Collection访问元素的通用方法,他可以用返回一个指定长度的object数组什么的形式,而却用了迭代器。2008年9月16日 12:09
17个答案 按时间排序 按投票排序
-
因为数组是定长的,而且,你要是Map结构的话,去实现数组那得多麻烦?下面这段代码是struts标签中<html:optionCollection>的部分源代码,
protected Iterator getIterator(Object collection) throws JspException { if (collection.getClass().isArray()) { collection = Arrays.asList((Object[]) collection); } if (collection instanceof Collection) { return (((Collection) collection).iterator()); } else if (collection instanceof Iterator) { return ((Iterator) collection); } else if (collection instanceof Map) { return (((Map) collection).entrySet().iterator()); } else if (collection instanceof Enumeration) { return new IteratorAdapter((Enumeration) collection); } else { throw new JspException( messages.getMessage("optionsCollectionTag.iterator", collection.toString())); } }
可以看出,不管是集合还是Map,还是枚举,他们最后都可以统一的转换为iterator的形式输出。而你要是数组呢??想想得写多少代码?2008年9月21日 09:15
-
很同意 fishbottle 的延迟说法, 如果你械遍历100W行的表, 你用List?
但不用延迟时, 个人认为用array list的get好点, 速度比iterator快2008年9月20日 12:18
-
不是所有的常用的集合都可以get(i)的,例如list这样的无序集合,你不可能get(i)啊,那么你要如何遍历集合呢?只有iterator了么
2008年9月18日 15:15
-
这里楼主要注意下,Iterator针对的是Collection集合,而Map不属于Collection中。而在Collection集合中,我们用的最多的是List和Set
2008年9月17日 17:41
-
iterator模式的作用在于对于所有需要有抽象循环逻辑的应用,都可以使用iterator模式对其进行统一的逻辑处理。
在某些时候可以提高速度和空间利用度(因为遍历的方向是确定的,所以可以针对这个确定的方向进行预读取和cache)2008年9月17日 17:38
-
引用而且一个方法只接受Collection作为参数也很少见
这个确实少见,但是拿List作为参数就不少见了,其实用最普通的话说,iterator为我们把所有Collection的集合遍历,最终都归结到Iterator,也就是说把虽有的Collection集合统一了,这样,我们的代码重用性提高了,耦合性降低了。2008年9月17日 16:49
-
引用如果是封装变化的话,我完全可以将get方法加入到最底层的接口Collection中,这样所有实现Collection的集合类都可以用get(i)遍历元素,但是JAVA集合类最底层却是Iterator接口
Iterator正是封装了不同collection的"get"方法。之后以是带引号的get方法是因为不同类型的"get"方法都是不一样的。
感觉楼主可以找本设计模式的书好好看一下。看完之后你就会有所领悟啦。2008年9月17日 15:30
-
引用如果是封装变化的话,我完全可以将get方法加入到最底层的接口Collection中,这样所有实现Collection的集合类都可以用get(i)遍历元素,但是JAVA集合类最底层却是Iterator接口
如果是Set,用get(i)是不符合逻辑意义的。2008年9月17日 13:29
-
嘿嘿,上面有两段文皱皱的话是搬书上面的。
不过上面两句确实描述的很完整。
使用Iterator模式我认为主要的作用在于封装变化。不用你拿JAVA COLLECTION来做比喻也许更清楚一些。
比如说你有一个类,类中的数据结构比较复杂这个时候你其它的类需要取到这个类的数据,所以他要在他的类中去写一套遍历的方法。
系统运行了一段时间之后,你发现你的数据结构有问题,需要改变,这个时候你是不是需要再去修改过去原有的取数方法,修改数据级会相当的大。
但是如果你用Iterator模式的来实现你的类,其中你封闭了对你的类中数据结构的遍历的方法。当你数据结构有改变的时候你只要改变你本身类遍历方法就行了。
像collection这种他们肯定是尽最大努的避免去做类内的改变,因为改动的话牵扯的范围将会是无法估量的。使用Iterator也是对这种行为的一种保障。
嘿嘿,也许大牛们还有其它想法,这我就不知道了。2008年9月16日 23:13
-
Iterator模式的定义:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
Iterator模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示。把游走的任务放在Iterator上,而不是聚合上。这样简化了聚合的接口和实现,也让责任各得其所。
Iterator模式与开消的关系甚少。
只有在Hibernate的时候,query的list和iterator有那些个区别。2008年9月16日 22:38
-
这里为了遍历的时候减少开销用的,你想想看如果用
for (int i = 0;i < list.size(); i++) {
Object aa = list.get(i);
}
每次查询的时候都要去定位i的位置,在整个内存块中查找对应的值,而用下面这种遍历的话就不一样了
Iterator i = a.inerator();
while(i.hasNext()){
......
}
这样的话,遍历的一个一个往后移,减少了查找定位的开销.2008年9月16日 12:56
-
其实把楼主的所有问题,归结到一起,其实就是想问,Iterator到底的优势在哪里,我们能用List遍历出来,为什么还要用Iterator来遍历?不知道我对楼主理解的意思对不对。其实在楼主刚开始举的例子我们就能看出一个问题,就是说,如果我们要是用List来遍历的话,我们必须知道这个集合的内部结构,而Iterator不用这样。举另一个例子来说,在用List装载着bean,准备遍历出来,如果我们用iterator来遍历,如果我们今后要是更改List,那么遍历出来的操作的代码都不用我们重写,也就是说,将集合最后都归结到iterator,就好似一个规范一样,大家都来遵守他的规则,这样就提高了我们代码的可重用性。以上就是我的个人的看法。
2008年9月16日 12:47
-
模式有许多的重要性在于可以将实现延迟,Iterator在这方面也有体现:
比如有个函数void printOut(Collection c) { Iterator itr = c.iterator(); while(itr.hasNext()) { ... } }
这样,无论在调用该函数时,Collection是用Set还是ArrayList,还是其他实现Collection接口的对象,都可以遍历。2008年9月16日 12:24
相关推荐
### Java源码分析:深入探讨Iterator模式 #### 一、引言 在Java编程语言中,集合框架(`java.util`包)提供了多种容器类来存储对象,如`List`、`Set`和`Map`等。为了遍历这些容器中的元素,Java引入了迭代器模式...
所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式。本文以java中的容器为例,模拟Iterator的原理。 参考:马士兵 Java设计模式 Iterator 1.首先定义一个容器Collection接口. 2.定义一个Iterator...
Iterator模式是一种设计模式,主要用于遍历容器(如集合、数组)中的元素,提供了一种统一的访问方式,而无需暴露容器的内部结构。在Java中,`java.util.Iterator`接口就是这种模式的一个典型应用。在给定的文档中,...
【Iterator模式】是一种设计模式,它提供了一种顺序访问聚合对象元素的方式,而又不暴露其底层表示。在Java中,Iterator接口是实现此模式的主要工具,它允许我们遍历任何集合,如ArrayList、LinkedList等,而无需...
迭代器模式是软件设计模式中的一种行为模式,它在C++中的应用十分广泛。这个模式的主要目的是提供一种方法来顺序访问聚合对象的元素,而无需暴露其底层表示。通过使用迭代器模式,用户可以遍历任何聚合对象,而无需...
C#面向对象设计模式 (行为型模式) Iterator 迭代器模式 视频讲座下载
Iterator模式是一种设计模式,它提供了一种顺序访问聚合对象的元素而不暴露其底层表示的方法。在Java中,Iterator模式常用于遍历集合(如ArrayList、LinkedList等)和Map,使得开发者可以方便地对集合进行操作,而...
Iterator模式是一种设计模式,它允许程序访问集合对象的元素而不暴露其底层表示。在这个场景中,我们关注的是如何使用Iterator模式将对象转换为可读性强的字符串,这在日志记录、调试或输出对象信息时非常有用。我们...
Iterator模式是一种行为设计模式,它的主要作用是在不暴露容器内部结构的情况下,允许外部代码逐个访问容器中的元素。在Java中,Iterator模式被广泛应用于集合框架,如ArrayList、LinkedList等,使得用户能够方便地...
### C++中的Iterator模式详解 #### 什么是Iterator模式? 在软件工程中,设计模式是一种用于解决特定问题的通用可重用解决方案。Iterator模式是其中的一种,其主要目标是在不暴露集合内部结构的情况下,为遍历集合...
大体思想:分页的核心思想采用 Iterator模式,每次从数据库中取定量的数据块 其中block和pageCount是两个不同的概念,block是块,规定了从数据库中获取的数量 pageCount为表现层每页显示的数量 另外参数中还包含缓存...
在文件名称“IteratorPattern01”中,我们可以推测这可能是一个关于迭代器模式的示例代码或教程,可能包含了如何创建迭代器接口、具体迭代器类、聚合接口以及具体聚合类的实现,通过具体的代码来展示如何使用迭代器...
- **抽象迭代器(Iterator)**:定义了遍历元素的接口,包括初始化、判断是否还有下一个元素、获取当前元素和移动到下一个元素等方法。 - **具体迭代器(ConcreteIterator)**:实现了抽象迭代器接口,具体实现如何...
在Java编程语言中,Iterator模式是一种设计模式,用于在各种数据结构(如集合)中进行迭代操作,使得用户可以顺序地访问集合中的元素,而无需了解底层数据结构的细节。这个模式有效地解耦了集合对象和遍历行为,提供...
F_Java源码分析:深入探讨Iterator模式
例如,在Java中,`Iterable`接口和`Iterator`接口就是实现迭代器模式的关键。`Iterable`接口定义了获取迭代器的方法`iterator()`,而`Iterator`接口提供了`hasNext()`和`next()`方法,分别用于检查是否还有下一个...
迭代器模式是一种设计模式,它提供了一种方法来顺序访问聚合对象的元素,而又不暴露其底层表示。在C++中,迭代器模式通常通过定义一个接口,该接口允许访问和遍历聚合对象的元素,而无需暴露其内部结构。这种模式在...
在Java中,迭代器模式的实现通常使用`Iterable`接口和`Iterator`接口。`Iterable`接口定义了一个`iterator()`方法,返回一个`Iterator`实例。`Iterator`接口则包含`hasNext()`和`next()`方法。 ```java public ...
这个资源的目的是通过模拟Java ArrayList的Iterator实现,帮助理解Iterator设计模式。 首先,我们来详细解释一下ArrayList和Iterator的概念。ArrayList是一个可变大小的数组,它允许我们在任何位置插入和删除元素。...