迭代的使用';s.hasNext();and.next();Java中的方法

迭代的使用';s.hasNext();and.next();Java中的方法,java,arraylist,while-loop,iteration,Java,Arraylist,While Loop,Iteration,有两天我对.hasNext()感到非常困惑和下一步()迭代接口方法,尤其是在while循环中。让我举一个例子: import java.util.*; // imported whole java.util package. class Main { public static void main(String[] args) { ArrayList<String> cars = new ArrayList<String>(); // created A

有两天我对.hasNext()感到非常困惑下一步()迭代接口方法,尤其是在while循环中。让我举一个例子:

import java.util.*;  // imported whole java.util package.

class Main {
  public static void main(String[] args) {
    ArrayList<String> cars = new ArrayList<String>();  // created ArrayList which name is cars.
    cars.add("Volvo");
    cars.add("Mercedes"); 
    cars.add("BMW");


    Iterator<String> x = cars.iterator();

    while(x.hasNext()) {
      System.out.print(x.next() + " ");  // It prints Volvo Mercedes BMW
    }
  }
}
import java.util.*;//导入了整个java.util包。
班长{
公共静态void main(字符串[]args){
ArrayList cars=new ArrayList();//创建了名为cars的ArrayList。
添加(“沃尔沃”);
加上(“梅赛德斯”);
加上(“宝马”);
迭代器x=cars.Iterator();
while(x.hasNext()){
System.out.print(x.next()+“”);//它打印沃尔沃-奔驰-宝马
}
}
}
我知道.hasNext()是布尔值,如果迭代包含元素,则返回true。.next()而(x.hasNext())并再次进入循环的内部,但是这个循环的计数器在哪里?我的意思是,在打印沃尔沃之后,它如何进入下一个元素?它返回所有元素,如果没有更多的,则返回.hasNext()返回false,代码继续下一行是简单的答案和正确的,但我想清楚地理解它。

实际上,迭代器()方法为(比方说)Arraylist中的所有元素创建迭代器。现在在代码中,while循环x.hasNext()的条件检查列表是否包含元素,如果是,则返回true,否则返回false

现在,x.next()指向ArrayList中的第一个元素(例如LinkedList),并存储该对象(在您的示例中为Volvo)。当您调用此方法时,它基本上为您提供了列表中该对象的引用,迭代器移动到列表中的下一个元素。调用next()方法时,迭代器(本例中为x)返回对象,然后移动到下一个元素(本例中为Mercedes)

现在,当您再次调用next()方法时,您将发现Mercedes被返回。若要了解它的工作原理,请三次键入System.out.println(x.next()),而不是while loopu将了解它移动到下一个位置。如果您第四次键入System.out.println(x.next()),它将给出异常,因为您的列表中没有更多的元素。线程“main”java.util.NoSuchElementException中的异常这是异常

这就是为什么使用hasNext()方法检查元素是否存在。 您可以将其与linkedlist(数据结构,如果您知道的话)的打印进行比较,我们将一个对象点打印到头部节点,然后移动到下一个节点。这里的情况与此相同,它返回当前元素(对象)并移动到下一个元素(对象)。

实际上,迭代器()方法为(比方说)Arraylist中的所有元素创建迭代器。现在在代码中,while循环x.hasNext()的条件检查列表是否包含元素,如果是,则返回true,否则返回false

现在,x.next()指向ArrayList中的第一个元素(例如LinkedList),并存储该对象(在您的示例中为Volvo)。当您调用此方法时,它基本上为您提供了列表中该对象的引用,迭代器移动到列表中的下一个元素。调用next()方法时,迭代器(本例中为x)返回对象,然后移动到下一个元素(本例中为Mercedes)

现在,当您再次调用next()方法时,您将发现Mercedes被返回。若要了解它的工作原理,请三次键入System.out.println(x.next()),而不是while loopu将了解它移动到下一个位置。如果您第四次键入System.out.println(x.next()),它将给出异常,因为您的列表中没有更多的元素。线程“main”java.util.NoSuchElementException中的异常这是异常

这就是为什么使用hasNext()方法检查元素是否存在。
您可以将其与linkedlist(数据结构,如果您知道的话)的打印进行比较,我们将一个对象点打印到头部节点,然后移动到下一个节点。这里的情况也是一样,它返回当前元素(对象)并移动到下一个元素(对象)。

是java ese for:继续这样做,直到事情发生变化

这有点像普通的家务活:

如何洗碗
  • 检查柜台右侧是否还有脏盘子
  • 如果有的话,做洗碗的事情:拿起最近的脏盘子,洗干净,然后把它放在柜台的左边,然后回到这个算法的开头
  • 否则(没有脏盘子),你就完了
编辑:我现在意识到“厨房柜台”是一个不幸的例子,因为它的谐音是“厨房柜台”和“代码中的柜台”。我将使用“累加器”而不是“代码中的计数器”来修复这种混淆

请注意,这里也没有蓄能器,而且洗碗时你也不会在脑子里数。你可以先清点一下你有多少脏盘子(比如说,15个盘子),然后写一份协议,在宣布你已经做了这项工作之前,你可以抓一个脏盘子整整15次,但你肯定意识到这只是一种方法,另一种方法是。。。每次洗完一个脏盘子后,检查是否还有脏盘子。这就是上面代码的工作原理

请注意,从厨房柜台右侧“取回”物品的操作会更改该厨房柜台的属性。现在上面少了一个项目

这同样适用于迭代器:对迭代器调用
.next()
,会以某种形式更改迭代器。毕竟,如果您调用next两次,这些调用的结果是不同的。与调用相比,比如说,
someArrayList.get(5)
连续多次调用;这根本不会改变arraylist,因此您会得到相同的结果
while (counterRightSide.hasItems()) {
    Dish dirty = counterRightSide.fetch();
    Dish clean = sink.clean(dirty);
    counterLeftSide.stow(clean);
}
    public Iterator<T> iterator() {
        return new Iterator<T>() {
            int counter = 0; // here it is!
 
            public boolean hasNext() {
                return counter < size();
            }

            public int next() {
                return get(counter++);
            }
        };
    }
while(condition){
//do something.
}
while(x.hasNext){
//do something.
}
while(x.hasNext){
x.next();
}
int cursor;       // index of next element to return
//...

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];
}
//...