pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

迭代器與 for

Iterator vs for(迭代器與 for)
本文介紹了迭代器與 for的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我在一次采訪中被問到使用迭代器比 for 循環有什么優勢,或者使用 for 循環比迭代器有什么優勢?

I was asked in an interview what is the advantage of using iterator over for loop or what is the advantage of using for loop over iterator?

任何人都可以回答這個問題嗎?

Can any body please answer this?

推薦答案

首先,有兩種for循環,它們的行為非常不同.一個使用索引:

First of all, there are 2 kinds of for loops, which behave very differently. One uses indices:

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

這種循環并不總是可能的.例如,List 有索引,但 Set 沒有,因為它們是無序的集合.

This kind of loop isn't always possible. For example, Lists have indices, but Sets don't, because they're unordered collections.

另一個,foreach 循環在幕后使用了一個迭代器:

The other one, the foreach loop uses an Iterator behind the scenes:

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

這適用于各種 Iterable 集合(或數組)

This works with every kind of Iterable collection (or array)

最后,您可以使用 Iterator,它也適用于任何 Iterable:

And finally, you can use an Iterator, which also works with any Iterable:

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

所以你實際上有 3 個循環要比較.

So you in fact have 3 loops to compare.

您可以用不同的術語來比較它們:性能、可讀性、易錯性、能力.

You can compare them in different terms: performance, readability, error-proneness, capability.

迭代器可以做一些 foreach 循環不能做的事情.例如,如果迭代器支持,您可以在迭代時刪除元素:

An Iterator can do things that a foreach loop can't. For example, you can remove elements while you're iterating, if the iterator supports it:

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

列表還提供了可以雙向迭代的迭代器.foreach 循環只從頭到尾迭代.

Lists also offer iterators that can iterate in both directions. A foreach loop only iterates from the beginning to an end.

但迭代器更危險且可讀性更差.當你只需要一個 foreach 循環時,它是最易讀的解決方案.使用迭代器,您可以執行以下操作,這將是一個錯誤:

But an Iterator is more dangerous and less readable. When a foreach loop is all you need, it's the most readable solution. With an iterator, you could do the following, which would be a bug:

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

foreach 循環不允許發生此類錯誤.

A foreach loop doesn't allow for such a bug to happen.

對于由數組支持的集合,使用索引訪問元素的效率稍高一些.但是如果你改變主意并使用 LinkedList 而不是 ArrayList,性能會突然變得很糟糕,因為每次訪問 list.get(i) 時,鏈表都必須循環所有它的元素直到第 i 個.迭代器(以及因此的 foreach 循環)沒有這個問題.它總是使用最好的方法來遍歷給定集合的元素,因為集合本身有它自己的 Iterator 實現.

Using indices to access elements is slightly more efficient with collections backed by an array. But if you change your mind and use a LinkedList instead of an ArrayList, suddenly the performance will be awful, because each time you access list.get(i), the linked list will have to loop though all its elements until the ith one. An Iterator (and thus the foreach loop) doesn't have this problem. It always uses the best possible way to iterate through elements of the given collection, because the collection itself has its own Iterator implementation.

我的一般經驗法則是:使用 foreach 循環,除非您真的需要迭代器的功能.當我需要訪問循環內的索引時,我只會使用帶有數組索引的 for 循環.

My general rule of thumb is: use the foreach loop, unless you really need capabilities of an Iterator. I would only use for loop with indices with arrays, when I need access to the index inside the loop.

這篇關于迭代器與 for的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Java Remove Duplicates from an Array?(Java從數組中刪除重復項?)
How to fix Invocation failed Unexpected Response from Server: Unauthorized in Android studio(如何修復調用失敗來自服務器的意外響應:在 Android 工作室中未經授權)
AES encryption, got extra trash characters in decrypted file(AES 加密,解密文件中有多余的垃圾字符)
AES Error: Given final block not properly padded(AES 錯誤:給定的最終塊未正確填充)
Detecting incorrect key using AES/GCM in JAVA(在 JAVA 中使用 AES/GCM 檢測不正確的密鑰)
AES-256-CBC in Java(Java 中的 AES-256-CBC)
主站蜘蛛池模板: TwistDx恒温扩增-RAA等温-Jackson抗体-默瑞(上海)生物科技有限公司 | 集装袋吨袋生产厂家-噸袋廠傢-塑料编织袋-纸塑复合袋-二手吨袋-太空袋-曹县建烨包装 | 蔡司三坐标-影像测量机-3D扫描仪-蔡司显微镜-扫描电镜-工业CT-ZEISS授权代理商三本工业测量 | 圣才学习网-考研考证学习平台,提供万种考研考证电子书、题库、视频课程等考试资料 | 河南中整光饰机械有限公司-抛光机,去毛刺抛光机,精密镜面抛光机,全自动抛光机械设备 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 真石漆,山东真石漆,真石漆厂家,真石漆价格-山东新佳涂料有限公司 | 报警器_家用防盗报警器_烟雾报警器_燃气报警器_防盗报警系统厂家-深圳市刻锐智能科技有限公司 | 湖北省煤炭供应链综合服务平台 | 气动|电动调节阀|球阀|蝶阀-自力式调节阀-上海渠工阀门管道工程有限公司 | 快速卷帘门_硬质快速卷帘门-西朗门业| wika威卡压力表-wika压力变送器-德国wika代理-威卡总代-北京博朗宁科技 | 船老大板材_浙江船老大全屋定制_船老大官网 | 喷砂机厂家_自动除锈抛丸机价格-成都泰盛吉自动化喷砂设备 | 水轮机密封网 | 水轮机密封产品研发生产厂家 | 混合反应量热仪-高温高压量热仪-微机差热分析仪DTA|凯璞百科 | 全国国际化学校_国际高中招生_一站式升学择校服务-国际学校网 | 魔方网-培训咨询服务平台| RV减速机-蜗轮蜗杆减速机-洗车机减速机-减速机厂家-艾思捷 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 探伤仪,漆膜厚度测试仪,轮胎花纹深度尺厂家-淄博创宇电子 | 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 上海盐水喷雾试验机_两厢式冷热冲击试验箱-巨怡环试 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 德国GMN轴承,GMN角接触球轴承,GMN单向轴承,GMN油封,GMN非接触式密封 | DDoS安全防护官网-领先的DDoS安全防护服务商 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | 筒瓦厂家-仿古瓦-寺庙-古建琉璃瓦-宜兴市古典园林建筑陶瓷厂有限公司 | 外贮压-柜式-悬挂式-七氟丙烷-灭火器-灭火系统-药剂-价格-厂家-IG541-混合气体-贮压-非贮压-超细干粉-自动-灭火装置-气体灭火设备-探火管灭火厂家-东莞汇建消防科技有限公司 | 锂电叉车,电动叉车_厂家-山东博峻智能科技有限公司 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 室内室外厚型|超薄型|非膨胀型钢结构防火涂料_隧道专用防火涂料厂家|电话|价格|批发|施工 | 珠宝展柜-玻璃精品展柜-首饰珠宝展示柜定制-鸿钛展柜厂家 | 广州二手电缆线回收,旧电缆回收,广州铜线回收-广东益福电缆线回收公司 | 无线联网门锁|校园联网门锁|学校智能门锁|公租房智能门锁|保障房管理系统-KEENZY中科易安 | 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 神超官网_焊接圆锯片_高速钢锯片_硬质合金锯片_浙江神超锯业制造有限公司 | 超声波清洗机_大型超声波清洗机_工业超声波清洗设备-洁盟清洗设备 | 超声波乳化机-超声波分散机|仪-超声波萃取仪-超声波均质机-精浩机械|首页 | 北京公司注册_代理记账_代办商标注册工商执照-企力宝 | 中山东港家具集团-酒店-办公-医养家具定制厂家 |