迭代器模式也是属于23种常用的设计模式里面的。这个的使用频率非常高。
什么叫迭代器模式?
提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
怎么理解这段话?
提供一个方法访问容器?首先要搞明白什么是容器。我的理解是在java中可以管理一组相同对象,且可以对对象进行增删改查的都可以称作容器。所以在java 中我认为集合就是一个容器。而且集合都可以被迭代。且集合可以存放对象,那么如果有个东西可以遍历对象。那么自然你就能得到每个对象的所有属性和方法。这个东西非迭代器莫属。事实上迭代器最常用的就是迭代集合。而且java 自身有迭代器这个类。下面我写一段遍历map集合的一段程序。
packagecom.fish.iterator;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.Map;
importjava.util.Map.Entry;
public class Test {
public static void main(String[] args) {
Person person1 = new Person("000001", "张三");
Person person2 = new Person("000002", "李四");
Person person3 = new Person("000003", "王五");
Map<String, Person> map = new HashMap<String, Person>();
map.put(person1.getId(), person1);
map.put(person2.getId(), person2);
map.put(person3.getId(), person3);
//上面我把数据全部放进了map里面,接着这么遍历map里面的数据,接着迭代器就发挥作用了。
首先map放值是以键值对存放的,所以要遍历map就必须先获得一个实体entrySet而这个对象本身有迭代的方法。然后我们通过迭代器来实现一个迭代。
Iterator<Entry<String,Person>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Entry< String, Person>entry=iterator.next();
System.out.println( entry.getKey()+entry.getValue().getName());
}
}
}
结果是
000002李四
000003王五
000001张三
从结果上来我们获得了map里面的所有数据,而且map里面的数据是无序的。
为什么这段代码就能进行迭代?
我们看看java本身是这么写这个iterator的。我们深入到这个itertor类里面可以看到有一个接口。这个接口里面只有3个方法。当然我们看不到java本身实现这个接口的类。
public interface Iterator<E> {
boolean hasNext();
E next();
void remove();
}
其中hasnext是一个boolean类型,所以可以推断,这是用来控制循环的。
看到next我首先想到的是链表。就是每次往下走一个。也就是如果map在hasnext条件也为真的情况下调用next每次往下走,同时next里面有个计数器会自增。而这个计数器一定是作为hasnext的一个比较条件。当这个计数器和集合长度一样就停止。也就hasnxet为flase。
我们可以验证一下我的猜测,我把代码这样写
while (iterator.hasNext()) {
// Entry< String, Person>entry=iterator.next();
// System.out.println( entry.getKey()+entry.getValue().getName());
System.out.println("111");
}
输出的结果是死循环,因为没有往下走条件一直未真。所以next里面有一个计数器。所以迭代器模式是通过遍历算法来实现的。所以我只能借住别人的代码来实现一个迭代器。我写这个目的是加深理解集合和这种思想的。