Java集合中迭代器中的游标实现
全部, 只是一个编程新手。我在研究java集合和迭代器,我想知道如何使用游标来迭代集合Java集合中迭代器中的游标实现,java,collections,iterator,cursor,Java,Collections,Iterator,Cursor,全部, 只是一个编程新手。我在研究java集合和迭代器,我想知道如何使用游标来迭代集合 public class Collections { public void myFun() { int i=0; List<String> listObj = new ArrayList<String>(); listObj.add("Hello"); Iterator<String> itr = listObj.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();
}
我的问题在下面一行
while(itr.hasNext())
NAME VALUE
----- -------
itr ArrayList$Itr (id=45)
|_ cursor 0
|_ expectedModCount 1
|_ lastRet -1
|_ this$0 ArrayList<E> (id=28)
|_ [0] "Hello" (id=40)
名称值
----- -------
itr阵列列表$itr(id=45)
|_光标0
|_预期模数1
|_拉斯特雷特-1
|_此$0数组列表(id=28)
|_[0]“你好”(id=40)
hasNext()
在您第一次调用它时(在调用next()
之前)将返回true,因为下一个元素是列表的第一个元素,而您的列表只有一个元素
第一次调用itr.next()
,它将返回列表的第一个元素
cursor
是调用next()
返回的下一个元素的索引:
lastRet
是返回的最后一个元素的索引(通过上次调用next()
):
我刚刚调试了整个代码,找到了以下解决方案
public boolean hasNext() {
return cursor != size;
}
基于上述逻辑,此方法将返回true或false。游标的默认值为“0”,并根据数组列表的大小对其进行检查。i、 例如,在我的例子中,hasNext()将返回true,因为游标(值=0)!=大小(值=1),这也适用于空数组列表
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 my program,lastRet=-1,i=0;这将返回elementData[0],即“Hello”1.“hasNext()将在您第一次调用它时(在调用next()之前)返回true”-感谢您的解释。但是,当列表为null时,hasNext()将在第一次调用next()之前返回false。在java文档下面“换句话说,如果{@link#next}将*返回一个元素而不是抛出一个异常,则返回{@code true}”。@Cyborgz我正在谈论您的特定代码示例,其中列表不是空的,因此第一个hasNext不会返回false。如果列表为null,则在尝试获取迭代器时将获得NullPointerException。如果为空,hasNext将立即返回false。非常感谢您在这方面的解释。这很有帮助。
/**
* 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;
public boolean hasNext() {
return cursor != size;
}
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];
}