只是一個初學者編程。我正在研究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())
在上例中,h asNext()返回True。但從我的理解來看,index [1]中沒有元素,因此它應該返回false。但它返回true。請幫我理解這個邏輯。
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
1.「hasNext()將在第一次調用它時返回true(在調用next()之前)」 - 感謝您的解釋。但是,當列表爲空時,甚至在調用next()之前,hasNext()將在第一次返回false。在java文檔下面「換句話說,如果{@link #next}會返回一個元素而不是引發異常,則返回{true}。」 – Cyborgz 2014-10-04 19:16:44
@Cyborgz我在說你的具體代碼示例,其中列表不是空的,因此第一個hasNext不會返回false。如果列表爲null,那麼在嘗試獲取迭代器時將得到NullPointerException。如果它是空的,hasNext將立即返回false。 – Eran 2014-10-04 19:22:41
非常感謝您在這方面的解釋。它是非常有用的。 – Cyborgz 2014-10-05 15:46:37