什么是迭代器和迭代,以及如何使用它们之间的区别?

问题描述 投票:161回答:12

我在Java中新的,我真的迭代器和迭代混淆。谁能给我解释一下,给些例子吗?

java iterator iterable
12个回答
176
投票

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

一个Iterator与迭代状态的对象。它可以让你检查是否有使用hasNext()更多的元素,并移动到下一个元素(如果有的话)使用next()

通常,Iterable应该能产生任何数量的有效Iterators的。


0
投票

问:可迭代和迭代器之间的区别是什么? 答:

迭代:它关系到forEach循环 迭代器:是关系到收藏

foreach循环的目标元素shouble可迭代。 我们可以从收集使用迭代器来获取对象一个接一个

可迭代存在于java.lang包 存在于java.util包迭代

仅包含一个方法迭代器() 包含三个hasNext()方法,下一个(),删除()

在推出1.5版本 在推出1.2版本


0
投票

除了ColinDSeeker答案。

简单来说,可迭代和Iterator是Java的集合框架提供了两个接口。

可迭代

一个类如果它想有一个for-each循环遍历其收藏来实现Iterable接口。但是,for-each循环只能通过在前进方向的收集用于循环,你将不能修改这个集合中的元素。但是,如果你想要的是读取元素的数据,那么它很简单,由于Java的lambda表达式它往往是一个衬垫。例如:

iterableElements.forEach (x -> System.out.println(x) );

迭代器

该接口使您能够遍历集合,获取和删除其元素。每个集合类的规定,返回一个迭代到集合的开始的迭代器()方法。这个接口在迭代的好处是,这个界面,你可以添加,修改或删除集合中的元素。但是,访问元素需要比迭代多一点的代码。例如:

for (Iterator i = c.iterator(); i.hasNext(); ) {
       Element e = i.next();    //Get the element
       System.out.println(e);    //access or modify the element
}

资料来源:

  1. Java Doc Iterable
  2. Java Doc Iterator

0
投票

Iterable简单介绍了用于在Java中每个循环

public interface Collection<E> extends Iterable<E>  

Iterator是管理遍历所有的Iterable类。它保持了我们在当前迭代,其中一个状态,知道下一个元素,以及如何得到它。


83
投票

Iterable的实现是一个提供自身的一个Iterator

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

迭代器是允许一些遍历没有分配权限的数据集合的一个简单的方法(虽然删除能力)。

public interface Iterator<E>
{
    boolean hasNext();
    E next();
    void remove();
}

Javadoc


11
投票

如果集合是可迭代,则可以使用迭代迭代(并因此可以被用在每个回路。)该迭代是实际对象,将通过收集迭代。


9
投票

实现可迭代接口允许一个对象是“的foreach”语句的目标。

class SomeClass implements Iterable<String> {}

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

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

迭代器是一个接口,其具有用于执行迭代所有元素。可迭代是提供迭代器的接口。


7
投票

我会回答关于特别ArrayList中的问题,作为一个例子,以帮助您更好地了解..

  1. 可迭代接口迫使其子类实现抽象方法“迭代器()”。
public interface Iterable {
  ...
  abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
  ...
}
  1. Iterator接口迫使其子类实现抽象方法“hasNext()”和“下一个()”。
public interface Iterator {
  ...
  abstract boolean hasNext(); //Returns true if the iteration has more elements.
  abstract E next();          //Returns the next element in the iteration.
  ...
}
  1. ArrayList的实现列表,列表实现收集和收藏实现可迭代..也就是说,你可以看到这样的关系 '可迭代< - 收集< - 名单< - ArrayList的'

。而可迭代,收集和名单只是声明抽象方法“迭代器()”和ArrayList单独实现它。

  1. 我要显示具有“迭代()”方法的ArrayList源代码的更详细信息如下。

“迭代()”方法返回类“ITR”它实现“迭代”的对象。

public class ArrayList<E> ... implements List<E>, ...
{
  ...
  public Iterator<E> iterator() {
              return new Itr();
  }


  private class Itr implements Iterator<E> {
          ...

          public boolean hasNext() {
              return cursor != size;
          }
          @SuppressWarnings("unchecked")
          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];
          }
          ...
  }
}
  1. 一些其它的方法或类将通过利用迭代器(ITR)的迭代如ArrayList集合的元素。

下面是一个简单的例子。

public static void main(String[] args) {

    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");

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

现在,是不是清楚了吗? :)


5
投票

最重要的考虑是有问题的项目是否应当能够被遍历一次以上。这是因为你总是可以通过()再次调用迭代器快退的可迭代,但没有办法退的迭代器。


2
投票

考虑具有10个苹果的例子。当它实现可迭代,这就像把每个苹果在盒子从1到10,并返回可被用于导航的迭代器。

通过实施迭代,我们可以得到任何苹果,苹果在明年盒等。

因此,实现迭代给出了一个迭代器来浏览其内容虽然导航,迭代器需要实现。


1
投票

从根本上说,两者是密切相关的对方。

考虑迭代器是一个接口,它可以帮助我们通过收集与一些不确定的方法,如hasNext(),未来(的帮助下穿越)和remove()

在另一面,可迭代是另一种接口,该接口,如果由类实现强制类可迭代和为目标for-each结构。它有一个来自Iterator接口本身的命名迭代只有一个方法()。

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

为了理解访问这些:

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

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


1
投票

作为解释here,在“可迭代”被引入到能够在foreach循环使用。实现了Iterable接口的类可以遍历。

迭代器是管理遍历所有的可迭代的类。它保持了我们在当前迭代,其中一个状态,知道下一个元素,以及如何得到它。

© www.soinside.com 2019 - 2024. All rights reserved.