您的位置:首页 > 编程语言 > Java开发

JDK源码阅读——ArrayList(2)

2016-04-11 16:39 525 查看
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;

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();
}

final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}


iterator()方法新建并返回一个ArrayList的迭代器,该迭代器是个内部类,扩展了Iterator< E >接口。迭代器分别使用两个int型变量cursor和lastRet分别指向下一个返回的元素和最近返回的元素。

迭代器中用得最多的方法是hasNext()和next()。hasNext()将cursor与ArrayList的size进行比较,若相等说明无下一个元素,则返回false,否则返回true;next()首先比较cursor与size,若cursor>=size则抛出异常,否则返回cursor所指向的元素并将cursor赋给lastRet,然后cursor++。

remove方法则删除lastRet所指向的元素,即上一个返回的元素,并将lastRet赋给cursor,同时lastRet = -1。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jdk 源码 arraylist