本文以Java10为背景,Java8到Java10只是增加了一些方法,总体结构没变。
转载请注明:https://blog.csdn.net/ydonghao2/article/details/82223381
Tal.Yuan
身为一个集合:那么遍历集合中的元素是最基本的功能,JDK提供了一个iterator迭代器,可迭代接口等。
Iterator和Iterable
很多初始学Java的同学不知道为什么会分Iterator和Interable,其实英文好点的同学就能知道这是什么意思。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中都有使用。
详情之后会更新》