数据结构(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提高篇(三十)-----Iterator

迭代对于我们搞Java的来说绝对不陌生。我们常常使用JDK提供的迭代接口进行Java集合的迭代。Iterator iterator = list.iterator(); while(i...
  • chenssy
  • chenssy
  • 2014年07月07日 17:33
  • 62881

ES6学习笔记之Iterator和for...of循环

原文地址:http://es6.ruanyifeng.com/#docs/iteratorIterator(遍历器)的概念JavaScript原有的表示“集合”的数据结构,主要是数组(Array)和对...
  • Real_Bird
  • Real_Bird
  • 2017年02月22日 11:09
  • 484

[转载] Java Iterator迭代器详解

Iterator(迭代器)作为一种设计模式,迭代器可以用于遍历一个对象,对于这个对象的底层结构开发人员不必去了解。 Java中的Iterator一般称为“轻量级”对象,创建它的代价是比较小的。这里笔者...
  • wangjianyu0115
  • wangjianyu0115
  • 2016年03月06日 12:32
  • 994

Java学习之Iterator(迭代器)的一般用法 (多方整理)

迭代器(Iterator)   迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。 ...
  • qq_27489007
  • qq_27489007
  • 2016年07月25日 20:16
  • 3173

Java Iterator的设计模式

今天看了“Thinking in java”Inner class章节,对Iterator的设计模式有了一点感悟,这里结合自己的拙见分享给感兴趣的各位。...
  • lcc921528642
  • lcc921528642
  • 2015年06月11日 21:34
  • 329

在JAVA中 迭代器Iterator的具体含义和用法!

list l = new ArrayList(); l.add("aa"); l.add("bb"); l.add("cc"); for (Iterator iter = l.iterator...
  • qq_29061341
  • qq_29061341
  • 2016年05月03日 09:16
  • 2089

Java集合迭代器 Iterator分析

Iterator是个接口,是对 collection 进行迭代的迭代器,用来遍历collection。但为什么Iterator要定义成一个接口,而非一个类呢?另外,Iterator又是如何实现对col...
  • lb2510798243
  • lb2510798243
  • 2016年01月05日 17:23
  • 954

java 数组实现迭代方法 iterator,模仿Arraylist

在网上搜了下,发现没有关于数组实现迭代的相关文章,所以自己写了下。 主要是模仿的一个Arraylist 实现的主要的功能! 代码如下: 首先建个接口: package com.list; p...
  • u010402518
  • u010402518
  • 2013年05月29日 22:40
  • 3116

Java 迭代器Iterator的详解

为了方便的处理集合中的元素,Java中出现了一个对象,该对象提供了一些方法专门处理集合中的元素.例如删除和获取集合中的元素.该对象就叫做迭代器(Iterator). 对 Collection 进行迭...
  • qq_33642117
  • qq_33642117
  • 2016年07月26日 21:13
  • 4057

Iterator遍历集合特点

Java中使用Iterator来遍历集合元素,Iterator遍历集合元素有以下几个特点:  Iterator遍历集合元素的过程中不允许线程对集合元素进行修改,否则会抛出ConcurrentMo...
  • qq_20916555
  • qq_20916555
  • 2016年05月01日 22:43
  • 1672
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构(Java)——迭代器Iterator
举报原因:
原因补充:

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