Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java集合中迭代器中的游标实现_Java_Collections_Iterator_Cursor - Fatal编程技术网

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();

全部,

只是一个编程新手。我在研究java集合和迭代器,我想知道如何使用游标来迭代集合

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())
  • 在上面的示例中,hasNext()返回True。但根据我的理解,索引[1]中没有元素,因此它应该返回false。但它又回到了现实。请帮助我理解这个逻辑

  • itr.next()返回值“Hello”。但根据我的理解,它需要返回数组列表中的下一个元素,因为它已经指向索引[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)  
    
    名称值
    -----                       -------
    itr阵列列表$itr(id=45)
    |_光标0
    |_预期模数1
    |_拉斯特雷特-1
    |_此$0数组列表(id=28)
    |_[0]“你好”(id=40)
    
  • 你能解释一下什么是lastRet吗?它是否与我的问题有关
  • 游标总是指向索引[0],这意味着数组列表中的第一个元素。请澄清我的理解
  • 问候,, Cyborgz

    hasNext()
    在您第一次调用它时(在调用
    next()
    之前)将返回true,因为下一个元素是列表的第一个元素,而您的列表只有一个元素

    第一次调用
    itr.next()
    ,它将返回列表的第一个元素

    cursor
    是调用
    next()
    返回的下一个元素的索引:

    lastRet
    是返回的最后一个元素的索引(通过上次调用
    next()
    ):


    我刚刚调试了整个代码,找到了以下解决方案

    public boolean hasNext() {
                return cursor != size;
            }
    
    基于上述逻辑,此方法将返回true或false。游标的默认值为“0”,并根据数组列表的大小对其进行检查。i、 例如,在我的例子中,hasNext()将返回true,因为游标(值=0)!=大小(值=1),这也适用于空数组列表

  • 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 my program,lastRet=-1,i=0;这将返回elementData[0],即“Hello”

  • 正如@Eran lastRet所说,它是返回的最后一个元素的索引

  • 光标始终设置为默认值“0”

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