publicstaticvoidmain(String[] args){ List<String> list = new ArrayList<>(); for (int i = 0 ; i < 10 ; i++ ) { list.add(i + ""); } Iterator<String> iterator = list.iterator(); int i = 0 ; while(iterator.hasNext()) { if (i == 3) { list.remove(3); } System.out.println(iterator.next()); i ++; } }
/** * An optimized version of AbstractList.Itr */ private class Itr implements Iterator<E> { intcursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount;
publicboolean hasNext() { returncursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) thrownew NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) thrownew ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } publicvoid remove() { if (lastRet < 0) thrownew IllegalStateException(); checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { thrownew ConcurrentModificationException(); } } @Override @SuppressWarnings("unchecked") publicvoid forEachRemaining(Consumer<? super E> consumer) { Objects.requireNonNull(consumer); finalintsize = ArrayList.this.size; int i = cursor; if (i >= size) { return; } finalObject[] elementData = ArrayList.this.elementData; if (i >= elementData.length) { thrownew 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(); } finalvoid checkForComodification() { if (modCount != expectedModCount) thrownew ConcurrentModificationException(); } }
其中,有三个属性:
1 2 3
int cursor; //index of next element to return int lastRet = -1; //index of last element returned; -1ifno such int expectedModCount = modCount;
@SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) thrownew NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) thrownew ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; }
publicstaticvoid main(String[] args) { List<String> list = new ArrayList<>(); for (int i = 0 ; i < 10 ; i++ ) { list.add(i + ""); } Iterator<String> iterator = list.iterator(); int i = 0 ; while(iterator.hasNext()) { if (i == 3) { iterator.remove(); //迭代器的remove()方法 } System.out.println(iterator.next()); i ++; } }