Java中的迭代器(模式)最详解(是什么?为什么用?怎么用?)

迭代器是一种设计模式------迭代器模式;Java根据这个设计模式设计的一个对象,就是Iterator迭代器。

在Java集合类Collection中有很多复杂的数据结构,比如ArrayList,LinkList ,HashSet 等等;它们的底层实现都各不相同,如果要用for循环遍历,那就要熟悉它们的数据结构是怎样的,获取对应的value的操作方法是什么;或者从它们之中排除某一个特定的值也要先拿出来进行比较,再调用集合类中特有的remove方法。

如:

ArrayList的For循环遍历:

Java中的迭代器(模式)最详解(是什么?为什么用?怎么用?)_第1张图片

那么,有没有一种方式,是不需要暴露容器的底层数据结构,又能让别人遍历容器元素的呢?

这就是迭代器模式:
它主要解决的问题就是提供一种方法给使用者顺序(必须是顺序,不能是逆序或者中途截取)获取集合容器中全部元素,并且按顺序输出;使用者无需关心内部数据结构的实现。遍历的工作也有原来的集合类主动去get ; 变为了迭代去主动去游走拿;这样的有个好处就是对LinkList这种遍历较慢的容器类能加快遍历速度。

怎么用?

在array.iterator()的时候就是会创建并且返回一个Itr 类,这个类是实现了Iterator 接口的。
看看源码:::Java中的迭代器(模式)最详解(是什么?为什么用?怎么用?)_第2张图片Java中的迭代器(模式)最详解(是什么?为什么用?怎么用?)_第3张图片
iterator.hasNext() 返回值是一个Boolean,循环中还有next就true,继续拿元素。
iterator.next() 返回值是一个Obejectt;就是下一个元素。

		ArrayList array = new ArrayList();
        array.add("a");
        array.add("b");
        array.add("c");
        Iterator iterator = array.iterator();
        while (iterator.hasNext()){
     
            String item = (String) iterator.next();
            System.out.println(item);
        }

        LinkedList linkedList = new LinkedList();
        linkedList.add("A");
        linkedList.add("B");
        linkedList.add("C");
        Iterator iterators = linkedList.iterator();
        while (iterators.hasNext()){
     
            String item = (String) iterators.next();
            System.out.println(item);
        }

        HashSet set = new HashSet();
        set.add("1");
        set.add("2");
        set.add("3");
        Iterator setIterator = set.iterator();
        while (setIterator.hasNext()){
     
            String item = (String) setIterator.next();
            System.out.println(item);
        }

        Vector vector = new Vector();
        vector.add("Q");
        vector.add("W");
        vector.add("E");
        Iterator vectorIterator = vector.iterator();
        while (vectorIterator.hasNext()){
     
            String item = (String) vectorIterator.next();
            System.out.println(item);
        }

看看输出什么:

Java中的迭代器(模式)最详解(是什么?为什么用?怎么用?)_第4张图片

确实是可以按顺序遍历容器中的各个元素的。

再来看看遍历的时候删除指定元素:

Java中的迭代器(模式)最详解(是什么?为什么用?怎么用?)_第5张图片

成功了,但是这里有个问题,就是在多线程并发情况下如果其中一个操作对原来的容器发生了删除等操作,就会影响到它的结构(长度和下标都会变),其它迭代器在遍历时就会抛出异常。

优点:
1:为遍历集合对象提供了多种方式。
2:简化了对不同的或者数据结构复杂的集合对象进行遍历和操作的难度。
3:新增新的集合对象和新增迭代器都很方便,简化了代码了重复循环遍历代码。
缺点:
1:不够直接遍历来的直观,不需要暴漏底层结构,增加了维护难度。
2:因为创建它本身也是一个类;所以每一个集合类都要对应新增一个迭代器,使类的数量成倍增加。(普通for循环不用创建新类)

以上就是个人对迭代器和迭代器模式的总结。如果有说的不对的地方欢迎留言指正。鞠躬。

Java中的迭代器(模式)最详解(是什么?为什么用?怎么用?)_第6张图片

你可能感兴趣的:(Java基础系列,设计模式,数据结构,设计模式,java)