簡體   English   中英

了解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如下:

  1. 存儲當前值,以便以后返回。
  2. 將索引前進到當前值之外的下一個值(如果不在列表末尾,則為“ nothing”)。
  3. 返回步驟1的當前值。

實際上,它始終始終指向“下一個”值,即使迭代完成並且沒有更多的項,在這種情況下也沒有“下一個”項。

這是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM