栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

迭代器与

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

迭代器与

首先,有两种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循环。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/388429.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号