美文网首页
Iterator、Iterable接口的使用及详解

Iterator、Iterable接口的使用及详解

作者: 03ca2835cf70 | 来源:发表于2019-10-15 16:54 被阅读0次

    https://www.cnblogs.com/softidea/p/5167676.html

    ava集合类库将集合的接口与实现分离。同样的接口,可以有不同的实现。

    Java集合类的基本接口是Collection接口。而Collection接口必须继承java.lang.Iterable接口。

    以下图表示集合框架的接口,java.lang以及java.util两个包里的。其他部分可以从左向右看,比如Collection的Subinterfaces有List,Set以及Queue等。

    image
    package java.util; 
    /** * An iterator over a collection.  Iterator takes the place of Enumeration in
     * the Java collections framework.  Iterators differ from enumerations in two
     * ways: <ul>
     *    <li> Iterators allow the caller to **remove elements** from the
     *         underlying collection during the iteration with well-defined
     *          semantics.
     *    <li> Method names have been improved.
     * </ul><p>
     *
     * This interface is a member of the 
     * <a href="{@docRoot}/../technotes/guides/collections/index.html">
     * Java Collections Framework</a>.
     *
     * @author Josh Bloch
     * @version %I%, %G%
     * @see Collection
     * @see ListIterator
     * @see Enumeration
     * @since 1.2 */
    public interface Iterator<E> { /** * Returns <tt>true</tt> if the iteration has more elements. (In other
         * words, returns <tt>true</tt> if <tt>next</tt> would return an element
         * rather than throwing an exception.)
         *
         * @return <tt>true</tt> if the iterator has more elements. */
        boolean hasNext(); /** * Returns **the next element** (每一次迭代,the next element就是index为0的元素)in the iteration.
         *
         * @return the next element in the iteration.
         * @exception NoSuchElementException iteration has no more elements. */ E next(); /** * 
         * Removes from the underlying collection the last element returned by the
         * iterator (optional operation).  This method can be called only once per
         * call to <tt>next</tt>.  The behavior of an iterator is unspecified if
         * the underlying collection is modified while the iteration is in
         * progress in any way other than by calling this method.
         *
         * @exception UnsupportedOperationException if the <tt>remove</tt>
         *          operation is not supported by this Iterator.
    
         * @exception IllegalStateException if the <tt>next</tt> method has not
         *          yet been called, or the <tt>remove</tt> method has already
         *          been called after the last call to the <tt>next</tt>
         *          method. */
        void remove();
    }
    

    以下例子是利用了Iterator接口的着三个方法,实现遍历ArrayList<String>类型。
    一开始迭代器在所有元素的左边,调用next()之后,迭代器移到第一个和第二个元素之间,next()方法返回迭代器刚刚经过的元素
    hasNext()若返回True,则表明接下来还有元素,迭代器不在尾部。
    remove()方法必须和next方法一起使用,功能是去除刚刚next方法返回的元素

    import java.util.ArrayList; import java.util.Collection;
     import java.util.Iterator;
     public class ForEachDemo { 
          public static void main(String... arg) {
            Collection<String> a = new ArrayList<String>();
            a.add("Bob");
            a.add("Alice");
            a.add("Lisy");
    
            Iterator<String> iterator = a.iterator(); while (iterator.hasNext()) {
                String ele = iterator.next();
                System.out.println(ele);//Bob  Alice  Lisy 
     }
            System.out.println(a);//[Bob, Alice, Lisy] 
            iterator = a.iterator();
            iterator.next();
            iterator.remove();
            System.out.println(a);//[Alice, Lisy] 
     }
    } 
    

    <pre>package java.lang; import java.util.Iterator; /** Implementing this interface allows an object to be the target of

    • the "foreach" statement.
    • @since 1.5 /
      public interface Iterable<T> { /
      * * Returns an iterator over a set of elements of type T.
      • @return an Iterator. */ Iterator<T> iterator();
        }</pre>
    [ 复制代码

    ](javascript:void(0); "复制代码")

    for-each循环可以与任何实现了Iterable接口的对象一起工作。
    而java.util.Collection接口继承java.lang.Iterable,故标准类库中的任何集合都可以使用for-each循环。

    Collection接口

    此接口的方法

    public interface Collection<E>{......}

    <caption> </caption>
    | Modifier and Type | Method and Description |
    | boolean | **[add](file:///D:/jdk1.7/docs/api/java/util/Collection.html#add(E))**([E](file:///D:/jdk1.7/docs/api/java/util/Collection.html "type parameter in Collection") e)

    Ensures that this collection contains the specified element (optional operation).

    |
    | boolean | **[addAll](file:///D:/jdk1.7/docs/api/java/util/Collection.html#addAll(java.util.Collection))**([Collection](file:///D:/jdk1.7/docs/api/java/util/Collection.html "interface in java.util")<? extends [E](file:///D:/jdk1.7/docs/api/java/util/Collection.html "type parameter in Collection")> c)

    Adds all of the elements in the specified collection to this collection (optional operation).

    |
    | void | **[clear](file:///D:/jdk1.7/docs/api/java/util/Collection.html#clear())**()

    Removes all of the elements from this collection (optional operation).

    |
    | boolean | **[contains](file:///D:/jdk1.7/docs/api/java/util/Collection.html#contains(java.lang.Object))**([Object](file:///D:/jdk1.7/docs/api/java/lang/Object.html "class in java.lang") o)

    Returns <tt>true</tt> if this collection contains the specified element.

    |
    | boolean | **[containsAll](file:///D:/jdk1.7/docs/api/java/util/Collection.html#containsAll(java.util.Collection))**([Collection](file:///D:/jdk1.7/docs/api/java/util/Collection.html "interface in java.util")<?> c)

    Returns <tt>true</tt> if this collection contains all of the elements in the specified collection.

    |
    | boolean | **[equals](file:///D:/jdk1.7/docs/api/java/util/Collection.html#equals(java.lang.Object))**([Object](file:///D:/jdk1.7/docs/api/java/lang/Object.html "class in java.lang") o)

    Compares the specified object with this collection for equality.

    |
    | int | **[hashCode](file:///D:/jdk1.7/docs/api/java/util/Collection.html#hashCode())**()

    Returns the hash code value for this collection.

    |
    | boolean | **[isEmpty](file:///D:/jdk1.7/docs/api/java/util/Collection.html#isEmpty())**()

    Returns <tt>true</tt> if this collection contains no elements.

    |
    | [Iterator](file:///D:/jdk1.7/docs/api/java/util/Iterator.html "interface in java.util")<[E](file:///D:/jdk1.7/docs/api/java/util/Collection.html "type parameter in Collection")> | **[iterator](file:///D:/jdk1.7/docs/api/java/util/Collection.html#iterator())**()

    Returns an iterator over the elements in this collection.

    |
    | boolean | **[remove](file:///D:/jdk1.7/docs/api/java/util/Collection.html#remove(java.lang.Object))**([Object](file:///D:/jdk1.7/docs/api/java/lang/Object.html "class in java.lang") o)

    Removes a single instance of the specified element from this collection, if it is present (optional operation).

    |
    | boolean | **[removeAll](file:///D:/jdk1.7/docs/api/java/util/Collection.html#removeAll(java.util.Collection))**([Collection](file:///D:/jdk1.7/docs/api/java/util/Collection.html "interface in java.util")<?> c)

    Removes all of this collection's elements that are also contained in the specified collection (optional operation).

    |
    | boolean | **[retainAll](file:///D:/jdk1.7/docs/api/java/util/Collection.html#retainAll(java.util.Collection))**([Collection](file:///D:/jdk1.7/docs/api/java/util/Collection.html "interface in java.util")<?> c)

    Retains only the elements in this collection that are contained in the specified collection (optional operation).

    |
    | int | **[size](file:///D:/jdk1.7/docs/api/java/util/Collection.html#size())**()

    Returns the number of elements in this collection.

    |
    | [Object](file:///D:/jdk1.7/docs/api/java/lang/Object.html "class in java.lang")[] | **[toArray](file:///D:/jdk1.7/docs/api/java/util/Collection.html#toArray())**()

    Returns an array containing all of the elements in this collection.

    |
    | <T> T[] | **[toArray](file:///D:/jdk1.7/docs/api/java/util/Collection.html#toArray(T[]))**(T[] a)

    Returns an array containing all of the elements in this collection; the runtime type of the returned array is that of the specified array.

    |

    因为其中有一个返回值为Iterator<E>类型的iterator()方法,所以,java.util.Collection接口必须继承java.lang.Iterable接口

    实现Collection接口的每一个类都要实现以上众多方法,但开发者自己实现很麻烦。所以java提供了AbstractCollection类来编写具体的类。

    java.util

    Interface Collection<E>

    <dl>

    <dt>All Superinterfaces:</dt>

    <dd>Iterable<E></dd>

    </dl>

    <dl>

    <dt>All Known Subinterfaces:</dt>

    <dd>BeanContext, BeanContextServices, BlockingDeque<E>, BlockingQueue<E>, Deque<E>, List<E>, NavigableSet<E>, Queue<E>, Set<E>, SortedSet<E></dd>

    </dl>

    <dl>

    <dt>All Known Implementing Classes:</dt>

    <dd>AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList, BeanContextServicesSupport, BeanContextSupport, ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DelayQueue, EnumSet, HashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, Stack, SynchronousQueue, TreeSet, Vector</dd>

    </dl>

    Collection接口有三个常用的子接口,分别是List,Set,Queue。

    http://blog.csdn.net/xujinsmile/article/details/8543544

    为什么一定要去实现Iterable这个接口呢? 为什么不直接实现Iterator接口呢?

    看一下JDK中的集合类,比如List一族或者Set一族,
    都是继承了Iterable接口,但并不直接继承Iterator接口。
    仔细想一下这么做是有道理的。因为Iterator接口的核心方法next()或者hasNext()
    依赖于迭代器的当前迭代位置的。
    如果Collection直接继承Iterator接口,势必导致集合对象中包含当前迭代位置的数据(指针)。
    当集合在不同方法间被传递时,由于当前迭代位置不可预置,那么next()方法的结果会变成不可预知。
    除非再为Iterator接口添加一个reset()方法,用来重置当前迭代位置。
    但即时这样,Collection也只能同时存在一个当前迭代位置。
    而Iterable则不然,每次调用都会返回一个从头开始计数的迭代器。
    多个迭代器是互不干扰的。
    http://www.cnblogs.com/highriver/archive/2011/07/27/2077913.html

    [ 复制代码

    ](javascript:void(0); "复制代码")

    <pre>import java.util.Iterator; public class ForEachAPIDemo { public static void main(String[] args) throws Exception {
    Students students = new Students(10); for (Student student : students) {
    System.out.println(student.getSid() + ":" + student.getName());
    }
    }
    } // 支持for each迭代循环的学生集合类
    class Students implements Iterable<Student> { // 存储所有学生类的数组
    private Student[] students; // 该构造函数可以生成指定大小的学生类变量数组,并初始化该学生类变量数组
    public Students(int size) {
    students = new Student[size]; for (int i = 0; i < size; i++) {
    students[i] = new Student(String.valueOf(i), "学生" + String.valueOf(i));
    }
    }

    @Override public Iterator<Student> iterator() { return new StudentIterator();
    } // 实现Iterator接口的私有内部类,外界无法直接访问
    private class StudentIterator implements Iterator<Student> { // 当前迭代元素的下标
        private int index = 0; // 判断是否还有下一个元素,如果迭代到最后一个元素就返回false
        public boolean hasNext() { return index != students.length;
        }
    
        @Override public Student next() { return students[index++];
        } // 这里不支持,抛出不支持操作异常
        public void remove() { throw new UnsupportedOperationException();
        }
    }
    

    } class Student { private String sid; private String name; public Student(String sid, String name) {
    setSid(sid);
    setName(name);
    } public String getSid() { return sid;
    } public void setSid(String sid) { this.sid = sid;
    } public String getName() { return name;
    } public void setName(String name) { this.name = name;
    }

    @Override public String toString() { return "Student{" +
                "sid='" + sid + '\'' +
                ", name='" + name + '\'' +
                '}';
    }
    

    }</pre>

    相关文章

      网友评论

          本文标题:Iterator、Iterable接口的使用及详解

          本文链接:https://www.haomeiwen.com/subject/xtwsmctx.html