![](/img/trans.png)
[英]ConcurrentModificationException on Iterator.next()
[英]Understanding iterator.next functioning
Iterator<String> ir = arr.iterator();
while(ir.hasNext()) {
String an = ir.next();
System.out.println(an);
}
在ArrayList
ir返回一個指向first的列表對象。 現在, ir.next()
必須指向下一個對象。 那么為什么第一次循環運行時它指向第一個對象呢?
另外,
ListIterator<String> ir= arr.listIterator();
while(ir.hasNext())
{
String an= ir.next();
ir.set(an + '+');
System.out.println(an);
}
為什么不附加'+'
? 它只是打印原始的ArrayList
。
hasNext()
只是告訴你,如果有,你可以遍歷集合中的另一個元素。 next()
實際上返回所述元素。 光標的初始位置在第一個元素之前 。
例如,假設您具有以下條件:
0 1 2 3 4
| 8 | 5 | 2 | 3 | 7 |
光標實際上指向第一個元素之前的位置:
0 1 2 3 4
| 8 | 5 | 2 | 3 | 7 |
^
|
cursor
當您執行hasNext()
,它將檢查位置cursor + 1
處是否有任何東西。 如果您有一個空列表,則cursor + 1
沒有任何內容(即索引0
處沒有任何內容),因此它將返回false。 如果您位於最后一個元素,則cursor + 1 == list.size()
意味着列表末尾沒有任何內容。 如果您在列表中的其他位置,則cursor + 1
是填充的有效索引,因此它將返回true
。
當您實際執行next()
,它將前進光標並將元素返回到新位置。 現在,光標位於下一個元素之前的新位置。
現在,它甚至與內部的完成方式都沒有關系。 光標可能第一次指向第一個元素。 如果真是這樣,您所需要的就是處理這種情況的特殊邏輯(也許是一個檢查是否調用過next()
的標志)。
對於Iterator
,您需要了解的是hasNext()
會告訴您是否還有剩余元素可以迭代,而next()
將返回該元素。 此行為在調用之間是一致的,並且在所有實現中都應該是一致的。
Iterator
在第一次調用之前就指向第一個項目,這不是問題。
會發生什么事在next
如下:
實際上,它始終始終指向“下一個”值,即使迭代完成並且沒有更多的項,在這種情況下也沒有“下一個”項。
這是ArrayList
的迭代器 (一個稱為Itr
的內部類)的示例源代碼 :
private class Itr implements Iterator<E>
int cursor; // index of next element to return
默認值為0
,它已經指向第一個元素。
next()
方法執行上述步驟(以及其他一些步驟,以防止在迭代過程中進行修改)。
@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];
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.