我是Java的新手,我真的很困惑迭代器和可迭代器。谁能给我解释一下并举几个例子吗?


当前回答

大多数java接口以“able”结尾。例如可迭代的、可克隆的、可序列化的、可运行的等等。因此,Iterable是一个接口,它有一个名为iterator()的抽象方法,该方法返回一个iterator对象。

public interface Iterable {
  abstract Iterator<T> iterator(); 
}

迭代器接口有抽象方法“hasNext()”和“next()”。

public interface Iterator {
 abstract boolean hasNext();
 abstract E next();          
}

一个明确的使用是List扩展->Collections Interface->扩展Iterable

List<String> countrylist = new ArrayList<>();
list.add("US");
list.add("China");
list.add("Japan");
list.add("India");

Iterator<String> it = countrylist.iterator();
while (it.hasNext()) {
    String string = it.next();
    System.out.println(string);
}

其他回答

大多数java接口以“able”结尾。例如可迭代的、可克隆的、可序列化的、可运行的等等。因此,Iterable是一个接口,它有一个名为iterator()的抽象方法,该方法返回一个iterator对象。

public interface Iterable {
  abstract Iterator<T> iterator(); 
}

迭代器接口有抽象方法“hasNext()”和“next()”。

public interface Iterator {
 abstract boolean hasNext();
 abstract E next();          
}

一个明确的使用是List扩展->Collections Interface->扩展Iterable

List<String> countrylist = new ArrayList<>();
list.add("US");
list.add("China");
list.add("Japan");
list.add("India");

Iterator<String> it = countrylist.iterator();
while (it.hasNext()) {
    String string = it.next();
    System.out.println(string);
}

Iterable是一系列可以迭代的元素的简单表示。它没有任何迭代状态,例如“当前元素”。相反,它只有一个产生Iterator的方法。

迭代器是具有迭代状态的对象。它允许您使用hasNext()检查是否有更多元素,并使用next()移动到下一个元素(如果有)。

通常,Iterable应该能够产生任意数量的有效迭代器。

基本上来说,这两者都是密切相关的。

将Iterator视为一个接口,它帮助我们在一些未定义的方法(如hasNext(), next()和remove()的帮助下遍历集合。

另一方面,Iterable是另一个接口,如果由类实现,则强制该类为Iterable,并且是for - each构造的目标。 它只有一个名为iterator()的方法,该方法来自iterator接口本身。

当一个集合是可迭代的,那么它可以使用迭代器迭代。

为了了解,请访问以下内容:

ITERABLE: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java

迭代器http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java

实现Iterable接口允许一个对象作为foreach语句的目标。

class SomeClass implements Iterable<String> {}

class Main 
{
  public void method()
  {
     SomeClass someClass = new SomeClass();
     .....

    for(String s : someClass) {
     //do something
    }
  }
}

Iterator是一个接口,它具有迭代元素的实现。Iterable是一个提供迭代器的接口。

我知道这是一个老问题了,但是对于任何读到这篇文章的人来说,如果他们被同样的问题所困扰,并且可能被所有的术语所淹没,这里有一个很好的,简单的类比来帮助你理解迭代对象和迭代器之间的区别:

想想公共图书馆。旧的学校。用纸质书。是的,就是那种图书馆。

满满一书架的书就像一个可迭代对象。你可以看到书架上有一长排的书。你可能不知道有多少本书,但你可以看到这是一本很长的书集。

图书管理员就像迭代器一样。他可以在任何时候指出一本书。他可以在他所指向的位置插入/删除/修改/阅读书籍。每次你对着他喊“下一本!”时,他就依次指着每一本书。所以,你通常会问他:“有下一本书吗?”,他会说“有”,你说“下一本书!”,他会指向下一本书。他也知道什么时候他已经到了书架的尽头,所以当你问:“有下一个吗?”他会说“没有”。

我知道这有点傻,但我希望这能有所帮助。