问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

foreach和for的区别

发布网友 发布时间:2022-04-22 11:09

我来回答

12个回答

懂视网 时间:2022-05-17 17:56

之前听说火狐的JS引擎支持for each in的语法,例如下述的代码:

代码如下:
var arr = [10,20,30,40,50];
for each(var k in arr)
console.log(k);

即可直接遍历出arr数组的内容。

由于只有FireFox才支持,所以几乎所有的JS代码都不用这一特征。

不过在ActionScript里天生就支持for each的语法,不论Array还是Vector,还是Dictionary,只要是可枚举的对象都可以for in和for each in。

之前并没有感觉有太大的差异,为了懒得敲一个each单词,一直用熟悉的for in来遍历。

不过今天仔细琢磨了会,从数据结构的角度分析了下,觉得for in和for each in效率上有着本质的区别,无论是JS还是AS。

原因很简单:Array不是真正意义上的数组!

何为真正意义的数组?当然就是传统语言里type[]定义的数据类型,所有元素都是连续保存的。

“Array”虽然也是数组的意思,但熟悉JS的都知道,它其实是个非线性的伪数组,下标可以是任意数字。写入arr[1000000]并非真正申请容纳一百万个元素的空间,而是把1000000转换成相应的哈希值,对应到很小一块储存空间里,从而节省了大量内存。

例如有如下数组:

代码如下:
var arr = [];
arr[10] = 1000;
arr[20] = 2000;
arr[30] = 5000;
arr[40] = 8000;
arr[200] = 9000;

用for...in遍历Array,是个很累赘的过程:

遍历时每次访问arr[k],都要进行一次Hash(k)计算,根据散列表的容量取模,最终在冲突链表里找到结果。

如果支持for each...in的语法,其内部的数据结构就决定了会快很多:

Array里储存存了keys的列表,也把每个values值作为链表关联起来。每当有值添加或删除,就更新其链接关系。

当for each...in遍历时,只需从第一个节点往后迭代即可,无需任何Hash计算。

当然,对于AS3里Vector这样的线性数组来说,两者相差不大;同理,HTML5里支持二进制的数组ArrayBuffer也是如此。不过从理论上来看,即使arr是个连续的线性数组,for each in还是要快一点:

for...in遍历时,每次访问arr[k]都要进行下标越界检查;而for each in则根据内部链表,直接从底层反馈出迭代变量,节省了越界检查的过程。

热心网友 时间:2022-05-17 15:04

就编码来说各有好处:for更灵活,foreach更简便

就性能来说:看图。

热心网友 时间:2022-05-17 16:22

1.如果只是遍历集合或者数组,用foreach好些,快些。
2.如果对集合中的值进行修改,就要用for循环了。其实foreach的内部原理其实也是Iterator,但它不能像Iterator一样可以人为的控制,而且也不能调用iterator.remove();更不能使用下标来访问每个元素,所以不能用于增加,删除等复杂的操作。举个例子:
for(String aid:list){
if(aid.equals("aa")){
list.remove(aid); //这行会报错,不能修改list的长度
}
}
所以foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句。

热心网友 时间:2022-05-17 17:57

1.如果只是遍历集合或者数组,用foreach好些,快些。
2.如果对集合中的值进行修改,就要用for循环了。其实foreach的内部原理其实也是Iterator,但它不能像Iterator一样可以人为的控制,而且也不能调用iterator.remove();更不能使用下标来访问每个元素,所以不能用于增加,删除等复杂的操作。举个例子:
for(String aid:list){
if(aid.equals("aa")){
list.remove(aid); //这行会报错,不能修改list的长度
}
}
所以foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句。

热心网友 时间:2022-05-17 19:48

for和foreach有本质的区别
foreach的具体过程是由目标对象控制的
所以并非集合内容更改了就不可以使用foreach
而是Array和Collection对象如此实现了它而已
你却可以完全按照自己的想法去实现这一过程

也许你可以去翻一下Gof的Visitor模式,foreach看起来就是它的简化版本
我们应该把foreach当作一种设计模式而不是简单的一个循环语句去理解

目前C#里的foreach是以IEnumerable的方式去实现,这只是保留COM的实现方式,这种方式我认为其实不太便于理解
我想如果存在一个IForEachable其成员为ForEach(..),这样可能更能让人容易明白

热心网友 时间:2022-05-17 21:56

1.如果只是遍历集合或者数组,用foreach好些,快些。
2.如果对集合中的值进行修改,就要用for循环了。其实foreach的内部原理其实也是Iterator,但它不能像Iterator一样可以人为的控制,而且也不能调用iterator.remove();更不能使用下标来访问每个元素,所以不能用于增加,删除等复杂的操作。

热心网友 时间:2022-05-18 00:21

for和foreach都是java中重要的集合遍历方法 for循环中 你可以选择从前往后遍历 也可以从后往前遍历 也可以不遍历默写值 但是foreach只能从前往后遍历 而且每一个都会遍历一次 他们之间的选择得看你项目程序中的需求而定

热心网友 时间:2022-05-18 03:02

         // 1
         for (int i = 0; i < list.size(); i++) {
            int item = list.get(i);
            System.out.println("这是第" + (i+1) + "个:值为:" + item);
        }
        // 2
        int j = 0;
        for (int i : list) {
            ++j;
            System.out.println("这是第" + j + "个:值为:" + i);
        }

根据需要,使用不同的方法

如果需要对序列做处理用第一个

如果不需要做处理可以用第二个

热心网友 时间:2022-05-18 06:00

for是Java的循环关键字 foreach应该是前台的c:foreach吧 这是el表达式,都有循环功能,但是这区别 唔怎么说呢 就像牛和羊,虽然都能杀了吃肉,但是区别 你说牛和羊有区别么

热心网友 时间:2022-05-18 09:15

foreach是for循环的一种简便写法,但是只有实现了iterator的对象才能使用foreach循环。

热心网友 时间:2022-05-18 12:46

for循环
for循环,通过下标,对循环中的代码反复执行,功能强大,可以通过index取得元素。在处理比较复杂的处理的时候较为方便。

foreach循环
foreach,从头到尾,对于集合中的对象遍历。适用于简单的遍历。foreach使用的时候,会锁定集合的对象,期间不能进行修改。

使用的选择
foreach相对于for循环,代码减少了,但是foreach依赖IEnumerable。在运行的时候效率低于for循环。当然了,在处理不确定循环次数的循环,或者循环次数需要计算的情况下。使用foreach比较方便。而且foreach的代码经过编译系统的代码优化后,和for循环的循环类似。

可以说,foreach语句是for语句的特殊简化版本,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。在复杂的循环设计时,还是应该使用for循环更加的灵活。

热心网友 时间:2022-05-18 16:34

foreach语句是java5的新特征之一,在遍历数组、集合方面,foreach为开发人员提供了极大的方便。
foreach语句是for语句的特殊简化版本,但是foreach语句并不能完全取代for语句,然而,任何的foreach语句都可以改写为for语句版本。
foreach并不是一个关键字,习惯上将这种特殊的for语句格式称之为“foreach”语句。从英文字面意思理解foreach也就是“for 每一个”的意思。实际上也就是这个意思。
foreach的语句格式:
for(元素类型t 元素变量x : 遍历对象obj){
引用了x的java语句;

}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
大伙说说洗衣机要不要带烘干好 热烘干洗衣机怎么样 ef英语哪个好 EF英孚英语培训怎么样? 英孚英语好不好 EF英孚教育到底好不好 大佬们,麦芒7和荣耀10那个值得入手?2500以下的机子还有啥好推荐的么... 介绍几款2500元以前的手机 像素一定要高 其他的不做要求 近期想入手一部安卓手机,价格2200到2500左右…买HTC desire Z还是 三星... 笔记本忘记开机密码怎么办急死了 C#foreach 为什么循环使用Foreach 效率要高 404 Not Found win10如何高级设置提高性能 foreach循环必须要用string类型吗? win7系统如何提高电脑性能 有关c标签中forEach循环 for和foreach循环 win8.1如何提高电脑性能与速度 谁知盘中餐,粒粒皆辛苦的作者是谁? win10怎么把电脑调成高性能 windows10电脑怎么提高性能 简述foreach循环的语法结构和功能 foreach用法 foreach和for循环的区别 foreach 和 for 循环的区别 关于foreach循环的特点,以下说法哪些是正确的 Java的foreach怎么用? 关于foreach()循环 详细讲解foreach循环的用法 C#中的foreach循环怎么用? 为什么五行缺水?异类又包含水? 那个为什么五行缺火还是山头火命啊 为什么我会五行缺金 五行缺火土 为什么有人说我的五行里缺土有人说我缺金?我很迷茫不知道我五行里缺什么 求高人指点 五行缺金为什么不能戴金? 为什么我五行缺火 次忌五行也是火啊? 八字五行缺什么就补什么 八字偏弱,八字喜「火」,为何还说五行缺水?此命五行金旺;五行缺水;日主天干为土,那补水,还是补火? 冬季服装新款上市的广告词 春款上新文案怎么写? 最近我家新品上市,有什么好的宣传方案吗? 发动机号码:219348072是什么意思? 以个人的名字注册商标可以吗? 把一个网站的网名注册为商标,需要注册为45类商标中的哪一类呢? 网络红人网名注册商标是否有法律效应 江歌母亲申请江歌网名商标被驳回,被驳回的原因是什么? 要给一个名称注册商标具体如何操作? 个人名字注册为商标怎么办理 网名商标注册