迭代器没有直接获取getNextElement的方法而不移动光标

时间:2016-11-13 09:13:56

标签: java collections iterator

为什么没有方法直接获取元素而不迭代它?

我已经找到了答案,并找到了一些像这样的复制粘贴的答案:

  

它可以在当前的Iterator接口之上实现,但由于它的使用很少,因此将它包含在每个人都必须实现的接口中是没有意义的。

背后的原因是什么?

2 个答案:

答案 0 :(得分:0)

集合接口扩展“Iterable”。因此所有实现都必须使用迭代器。要直接在地图中获取Element,我们可以使用map.get(Key)。要获取List中的元素,我们可以使用index。由于List实现了RandaomAccess接口,因此很容易直接使用key获取元素。但在Set中我们无法直接得到一个元素。我想说的是,所有的实现都是不同的,但在我们需要通过集合中的对象的所有实现中,有一件事是常见的。这个工作是由Iterator完成的。

现在JAVA推动了面向对象的编程,所以使用iterator我们可以使用object(Iterator实例)并调用方法hasNext()来首先检查元素是否存在。它强加了迭代限制的限制。然后使用next()我们将获得下一个元素。所以hasNext()也强加了nullCheck。

简而言之,这促进了面向对象的概念和灵活的abstarction,供不同的实现使用。

答案 1 :(得分:-1)

  

Iterator没有直接使用getNextElement()的方法   移动光标?

为了解释这一点,我从Iterator(实现next()接口)中采用了AbstractList Iterator方法的以下代码。

public E next() {
      try {
          //some code
          return next;
       } catch (IndexOutOfBoundsException e) {
           //some code
           throw new NoSuchElementException();
     }
}

所以,现在如果你查看上面的代码,你会得到答案,因为如果你试图直接在{{1}上调用getNextElement()(或等同的next()在不知道索引的情况下,将抛出Iterator(将由IndexOutOfBoundsException包裹)。所以为了避免这种情况,我们首先检查下一个元素(索引)是否可用(使用NoSuchElementException),然后尝试从集合中检索元素。

此外,您需要注意迭代器是一种设计模式,其中迭代器用于遍历容器(集合)并访问容器的元素,您可以查看here 。换句话说,迭代器为您提供了循环访问集合的便捷方法,而无需担心底层集合的实现。