总所周知ArrayList中有一个方法叫iterator(),这个方法返回一个Iterator对象,通过这个对象,我们可以对ArrayList进行迭代,那么这个方法是怎么来的呢?
所有的集合都实现了Collection接口,下面是Collection接口的部分源码(与迭代器有关的那一部分):
public interface Collection<E> extends Iterable<E> { Iterator<E> iterator(); }看的出来他继承了一个叫Iterable的接口,我们继续看看他的源码:
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); } }这里面有一个接口方法,两个默认方法;其中这个接口方法正是我们要找的,他可以返回一个Iterator对象,我们点进Iterator这个类进去看看他的源码:
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()); } }现在我们回归本源,看看ArrayList中迭代器的具体实现:
//这是ArrayList实现的Iterable接口中的方法,返回的是他内部封装的一个类对象 public Iterator<E> iterator() { return new Itr(); } private class Itr implements Iterator<E> { int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; Itr() {} public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } @Override @SuppressWarnings("unchecked") public void forEachRemaining(Consumer<? super E> consumer) { Objects.requireNonNull(consumer); final int size = ArrayList.this.size; int i = cursor; if (i >= size) { return; } final Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) { throw new ConcurrentModificationException(); } while (i != size && modCount == expectedModCount) { consumer.accept((E) elementData[i++]); } // update once at end of iteration to reduce heap write traffic cursor = i; lastRet = i - 1; checkForComodification(); }由此可知,ArrayList实现了Iterable中的iterator()方法,让这个方法返回自己自定义的内部类,这个内部类实现了Iterator接口,成为了Iterator接口的一个对象,重写了Iterator接口中的next(), hasnext(),remove()方法,并将此对象在iterator方法中返回,由此实现了迭代;
另一个我们常说的增强for循环是怎么来的呢?
看的出来,在Iterable接口中有一个default foreach方法,这个方法所有实现Iterable接口的类都可以使用,所依所有实现了Iterable接口的类都可以使用增强for循环
