只是一个初学者编程。我正在研究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