为什么没有方法直接获取元素而不迭代它?
我已经找到了答案,并找到了一些像这样的复制粘贴的答案:
它可以在当前的Iterator接口之上实现,但由于它的使用很少,因此将它包含在每个人都必须实现的接口中是没有意义的。
背后的原因是什么?
答案 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 。换句话说,迭代器为您提供了循环访问集合的便捷方法,而无需担心底层集合的实现。