数据结构(Java)——迭代器Iterator

原创 2015年11月17日 17:12:45

感谢Java软件结构与数据结构 John Lewis Joseph chase 著 金名译
干大事而惜身,见小利而忘命,非英雄也!

1.迭代器定义

迭代器是一个对象,允许用户每次获得和使用集合中的一个元素,它与某个集合一同使用,但是它是一个单独的对象。迭代器是有助于实现某个集合的一种机制。
在java中,迭代器提供了一种标准方法,可以一次访问集合中的每一个元素,这是一种通用的操作。迭代器是一个对象,允许用户每次获取和使用集合中的一个元素。JavaAPI中迭代器由两个基本的接口实现的:
  • Iterator:用于定义一个对象,该对象作为一个迭代器。
  • Iterable:用于定义一个集合,从该集合中可以抽取出一个迭代器。
    集合定义为Iterable,当需要的时候可以提供一个Iterator对象。Iterable接口只有一个方法,名字为   iterator() 返回值是一个Iterator对象,当创建一个集合时需要确定元素的类型,通常是在迭代器中定义元素:
    public Iterator<T> iterator() {
        return new ArrayListIterator();
    }
    Iterator接口含有3个方法。前两个是hasNext和next,可以用于依次访问集合中的元素。
    大多数的迭代器都是fail-fast的,当迭代器使用之中,如果要修改集合将抛出一个异常。
    许多时候我们含显示迭代器的while,而不是使用for-each循环。因为,首先是一般不需要迭代的所有元素,另外,如果使用remove,需要调用显示的迭代器,然而foreach没有提供对迭代器的显示访问。

2.迭代器关键补充概念

【1】迭代器是一个对象,提供了一种依次访问集合中的每个元素的方式。
【2】经常把集合定义为Iterable的,这意味着需要时可以提供一个迭代器。
【3】迭代器的可选方法remove使得它可以删除一个元素,,而无需在遍历集合。
【4】大多是的迭代器都是fail-fast的,当迭代器仍在使用时,如果修改集合将抛出一个异常。
【5】不能假设迭代器访问元素的顺序,除非显示声明了。
【6】迭代器类往往实现为它所属的集合的内部类。
【7】迭代器检查修改计数,以确保与集合的修改计数一致。

3. 迭代器的实现

2.1 数组实现的迭代器

    private class ArrayListIterator implements Iterator<T>
    {
        int iteratorModCount;
        int current;

        /**
         * Sets up this iterator using the specified modCount.
         * 
         * @param modCount the current modification count for the ArrayList
         */
        public ArrayListIterator()
        {
            iteratorModCount = modCount;
            current = 0;
        }

        /**
         * Returns true if this iterator has at least one more element
         * to deliver in the iteration.
         *
         * @return  true if this iterator has at least one more element to deliver
         *          in the iteration
         * @throws  ConcurrentModificationException if the collection has changed
         *          while the iterator is in use
         */
        public boolean hasNext() throws ConcurrentModificationException
        {
            if (iteratorModCount != modCount)
                throw new ConcurrentModificationException();

            return (current < rear);
        }

        /**
         * Returns the next element in the iteration. If there are no
         * more elements in this iteration, a NoSuchElementException is
         * thrown.
         *
         * @return  the next element in the iteration
         * @throws  NoSuchElementException if an element not found exception occurs
         * @throws  ConcurrentModificationException if the collection has changed
         */
        public T next() throws ConcurrentModificationException
        {
            if (!hasNext())
                throw new NoSuchElementException();

            current++;

            return list[current - 1];
        }

        /**
         * The remove operation is not supported in this collection.
         * 
         * @throws UnsupportedOperationException if the remove method is called
         */
        public void remove() throws UnsupportedOperationException
        {
            throw new UnsupportedOperationException();
        }

    }   

2.2 链表实现的迭代器

/**
     * LinkedIterator represents an iterator for a linked list of linear nodes.
     */
    private class LinkedListIterator implements Iterator<T>
    {
        private int iteratorModCount;  // the number of elements in the collection
        private LinearNode<T> current;  // the current position

        /**
         * Sets up this iterator using the specified items.
         *
         * @param collection  the collection the iterator will move over
         * @param size        the integer size of the collection
         */
        public LinkedListIterator()
        {
            current = head;
            iteratorModCount = modCount;
        }

        /**
         * Returns true if this iterator has at least one more element
         * to deliver in the iteration.
         *
         * @return  true if this iterator has at least one more element to deliver
         *          in the iteration
         * @throws  ConcurrentModificationException if the collection has changed
         *          while the iterator is in use
         */
        public boolean hasNext() throws ConcurrentModificationException
        {
            if (iteratorModCount != modCount) 
                throw new ConcurrentModificationException();

            return (current != null);
        }

        /**
         * Returns the next element in the iteration. If there are no
         * more elements in this iteration, a NoSuchElementException is
         * thrown.
         *
         * @return the next element in the iteration
         * @throws NoSuchElementException if the iterator is empty
         */
        public T next() throws ConcurrentModificationException
        {
            if (!hasNext())
                throw new NoSuchElementException();

            T result = current.getElement();
            current = current.getNext();
            return result;
        }

        /**
         * The remove operation is not supported.
         * 
         * @throws UnsupportedOperationException if the remove operation is called
         */
        public void remove() throws UnsupportedOperationException
        {
            throw new UnsupportedOperationException();
        }
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自【zejian的博客】 关联...

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

为什么需要迭代器Iterator 迭代器Iterator的简单实现 迭代器Iterator与集合间存在的问题 理解快速失败机制fast-fail机制  进化版的ListIter...

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

理解Iterator接口 为什么需要迭代器(Iterator)   在分析迭代器前,我们先来了解一下为什么需要迭代器,在以前的代码中,我们总是通过如下去循环获取某些集合中的元素: List lis...
  • C_FuL
  • C_FuL
  • 2016年11月28日 10:38
  • 338

Java基础 - java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载出处(请尊重原创!谢谢~):  http://blog.csdn.net/javazejian/article/details/53073995  为什么需要迭代器Iterator ...

数据结构(Java)——迭代器和列表的实例

Java集合API提供的列表类主要是支持索引列表。在一定程度上,这些类同无序列表是重叠的。JavaAPI中没有实现事实上的有序列表。 【1】ArrayList是实现了基于动态数组的数据结构,Linke...

C++数据结构——二叉搜索树(实现自定义迭代器)

1.二叉搜索树抽象模型和相应的node对象表示   2.从二叉搜索树删除一个节点    (1)如果是叶子节点就直接删除    (2)被删除的节点有左节点,但没有右节点,则将左...

java集合+迭代器+数据结构概括+线程同步/异步和线程阻塞/非阻塞

一 集合类概述 为什么出现集合类?面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。以对象来管理对象。数组和集合类同是容器,有何不同?数组虽然也可以...
  • musk6
  • musk6
  • 2016年12月18日 21:59
  • 314

Java数据结构之迭代器

collection工具箱几乎为每一个集合类都提供了迭代器iterator供使用者对数据结构进行迭代访问;jdk 8下的用法如下: //keyset iterator Iterator...

Java数据结构(一)——StringBuffer,StringBuilder,Collection,Iterator,List

一.StringBuffer关于StringBuffer这个对象,Buffer是什么意思?缓冲区的意思,String一旦初始化时不可以被改变的,而StringBuffer是可以的,这就是区别,特点:•...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构(Java)——迭代器Iterator
举报原因:
原因补充:

(最多只允许输入30个字)