2014-10-04 86 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