2014-10-04 82 views
1

全部,Java集合中的迭代器中的光標實現

只是一個初學者編程。我正在研究java Collections和Iterator,我想知道如何使用遊標來迭代集合。

public class Collections { 

public void myFun() 
{ 
    int i=0; 
    List<String> listObj = new ArrayList<String>(); 
    listObj.add("Hello"); 
    Iterator<String> itr = listObj.iterator(); 

    while(itr.hasNext())       
    { 
     String s=(String)itr.next(); 
     System.out.println(" List Elements are : " +s); 
    } 
} 
public static void main(String[] args) { 

    Collections collObj = new Collections(); 
    collObj.myFun(); 
} 

}

按我的理解,listObj可變的內部存儲器表示看起來下面,

listObj Representation in memory 

---------------------------------------- 
| 45654846 | null | null | .... | null 
---------------------------------------- 
[0]  [1]  [2]  ... [10]  
. 
/|\ 
| 
| 
| 
itr (Cursor) 

我的問題在於以下行,

while(itr.hasNext()) 
  1. 在上例中,h asNext()返回True。但從我的理解來看,index [1]中沒有元素,因此它應該返回false。但它返回true。請幫我理解這個邏輯。

  2. itr.next()返回值 - 「你好」。但根據我的理解,它需要返回數組列表中的下一個元素,因爲它已經指向索引[0]。

而且,我觀看了迭代OBJ在調試模式,

NAME      VALUE 
-----      ------- 

itr       ArrayList$Itr (id=45) 
    |_ cursor    0 
    |_ expectedModCount  1 
    |_ lastRet    -1 
    |_ this$0    ArrayList<E> (id=28) 
     |_ [0]   "Hello" (id=40) 
  • 能否請您解釋一下什麼是lastRet?它有沒有與我的問題有關的任何地方?
  • 遊標總是指向索引[0],這意味着數組List中的第一個元素。請澄清我的理解。
  • 問候, Cyborgz

    回答

    0

    我剛剛調試的整個代碼及以下解決方案中,

    public boolean hasNext() { 
          return cursor != size; 
         } 
    

    根據上述邏輯,此方法將返回true或false。遊標的默認值是'0',並且根據數組列表的大小進行檢查。即在我的情況下,自從Cursor(value = 0)!= Size(value = 1)以來,hasNext()將返回true,這對於空數組列表也是如此。

  • itr.next()具有低於在ArrayList類實施方式中,

    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]; 
    } 
    

    WRT我的程序,lastRet = -1且i = 0;這將返回elementData中[0],這是「你好」

  • 正如@Eran lastRet說是最後一個元素的索引返回

  • 光標總是被設置爲「0」作爲其默認。
  • 2

    hasNext()將返回true,你第一次把它(曾經調用next()前),因爲下一個元素是列表的第一個元素,而列表中的一個元素。

    您第一次打電話給itr.next()時,它會返回列表的第一個元素。

    cursor是通過調用返回的下一元素的索引next()

    /** 
    * Index of element to be returned by subsequent call to next. 
    */ 
    int cursor = 0; 
    

    lastRet是返回(由最後一次調用到next())的最後一個元素的索引:

    /** 
    * Index of element returned by most recent call to next or 
    * previous. Reset to -1 if this element is deleted by a call 
    * to remove. 
    */ 
    int lastRet = -1; 
    
    +0

    1.「hasNext()將在第一次調用它時返回true(在調用next()之前)」 - 感謝您的解釋。但是,當列表爲空時,甚至在調用next()之前,hasNext()將在第一次返回false。在java文檔下面「換句話說,如果{@link #next}會返回一個元素而不是引發異常,則返回{true}。」 – Cyborgz 2014-10-04 19:16:44

    +0

    @Cyborgz我在說你的具體代碼示例,其中列表不是空的,因此第一個hasNext不會返回false。如果列表爲null,那麼在嘗試獲取迭代器時將得到NullPointerException。如果它是空的,hasNext將立即返回false。 – Eran 2014-10-04 19:22:41

    +0

    非常感謝您在這方面的解釋。它是非常有用的。 – Cyborgz 2014-10-05 15:46:37