迭代器与

迭代器与,第1张

迭代器与

首先,有两种for循环,它们的行为非常不同。一种使用索引

for (int i = 0; i < list.size(); i++) {    Thing t = list.get(i);    ...}

这种循环并非总是可能的。例如,列表具有索引,而集合没有索引,因为它们是无序集合。

另一个foreach循环在幕后使用Iterator:

for (Thing thing : list) {    ...}

这适用于每种Iterable集合(或数组)

最后,您可以使用Iterator,它也可以与任何Iterable一起使用:

for (Iterator<Thing> it = list.iterator(); it.hasNext(); ) {    Thing t = it.next();    ...}

因此,实际上您有3个循环要比较。

您可以用不同的术语来比较它们:性能,可读性,易错性,功能。

迭代器可以执行foreach循环无法执行的 *** 作。例如,如果迭代器支持,则可以在迭代时删除元素:

for (Iterator<Thing> it = list.iterator(); it.hasNext(); ) {    Thing t = it.next();    if (shouldBeDeleted(thing) {        it.remove();    }}

列表还提供可以双向迭代的迭代器。foreach循环仅从头到尾进行迭代。

但是,迭代器更危险,可读性更差。当您只需要一个foreach循环时,它就是最易读的解决方案。使用迭代器,您可以执行以下 *** 作,这将是一个错误:

for (Iterator<Thing> it = list.iterator(); it.hasNext(); ) {    System.out.println(it.next().getFoo());    System.out.println(it.next().getBar());}

foreach循环不允许发生此类错误。

对于数组支持的集合,使用索引访问元素的效率稍高。但是,如果您改变主意并使用linkedList而不是ArrayList,则性能会突然变差,因为每次访问时

list.get(i)
,链表都必须循环遍历所有元素,直到第i个元素为止。迭代器(以及foreach循环)不存在此问题。它始终使用最佳方式来遍历给定集合的元素,因为集合本身具有自己的Iterator实现。

我的一般经验法则是:使用foreach循环,除非您确实需要Iterator的功能。当我需要访问循环内的索引时,我只会使用带有数组索引的for循环。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/4964143.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-13
下一篇 2022-11-13

发表评论

登录后才能评论

评论列表(0条)

保存