Iterator,Iterable,ListIterator

版权声明:有关于交易的部分,如果有使用blog的策略,盈亏自负。https://blog.csdn.net/ydonghao2 https://blog.csdn.net/ydonghao2/article/details/82223381

本文以Java10为背景,Java8到Java10只是增加了一些方法,总体结构没变。 
转载请注明:https://blog.csdn.net/ydonghao2/article/details/82223381
Tal.Yuan

身为一个集合:那么遍历集合中的元素是最基本的功能,JDK提供了一个iterator迭代器,可迭代接口等。

Iterator和Iterable

        很多初始学Java的同学不知道为什么会分Iterator和Interable,其实英文好点的同学就能知道这是什么意思。Iterator是迭代者,Iterable是可以迭代的。那么Iterator和Iterable有什么关系呢?

Iterator和Iterable的关系

       我们再来看看源码:

public interface Iterator<E> {

    boolean hasNext();

    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

       Iterator这是集合中的一个元素,元素的类型是E(泛型,会被Object檫除)。而hashNext(),next(),remove都是迭代的时候的操作。

       forEachRemaining 方法放在这里有点不恰当,不过它也声明了它是对剩下所有的元素进行Consumer的动作。这个是Java8的内容。

public interface Iterable<T> {

    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

forEach和Iterator一样,就不细讲了。

Spliterator interface 可以看:https://blog.csdn.net/ydonghao2/article/details/81225050

Iterator和Iterable都只是interface 。那么实现在哪呢?

这里穿插一下Collections的知识:

public interface Collections {
    ... ...
    public Iterator<E> iterator() {
        return new Iterator<E>() {
                private final Iterator<? extends E> i = c.iterator();

                public boolean hasNext() {return i.hasNext();}
                public E next()          {return i.next();}
                public void remove() {
                    throw new UnsupportedOperationException();
                }
                @Override
                public void forEachRemaining(Consumer<? super E> action) {
                    // Use backing collection version
                    i.forEachRemaining(action);
                }
            };
    }
    ... ...
}

这里的Collections只是给一个例子让大家认识:如果想迭代某个东西,可以把自己内部所有的元素都当成Iterator。

这点在ArrayList中表现更加明显:ArrayList先impl 了List,List又extends了Collection,Collection又extends了Iterable,那么ArrayList就会有Iterable的特性(即可迭代)。既然ArrayList是Iterable的,那么ArrayList是怎么处理每个元素的呢?它实现了Iterator,每个Iterator都对应一个元素。

详情之后会更新》

ListIterator

  ListIterator只是Iterator的一个加强版,可以根据自己的需求去看用不用实现。

public interface ListIterator<E> extends Iterator<E> {

    boolean hasNext();

    E next();

    boolean hasPrevious();

    E previous();

    int nextIndex();

    int previousIndex();

    void remove();

    void set(E e);

    void add(E e);
}

ListIterator在ArrayList和LinkedArrayList中都有使用。

详情之后会更新》

猜你喜欢

转载自blog.csdn.net/ydonghao2/article/details/82223381