本文目录
foreach和for循环的区别
foreach 依赖 IEnumerable.
第一次 var a in GetList() 时 调用 GetEnumerator 返回第一个对象 并 赋给a,
以后每次再执行 var a in GetList() 的时候 调用 MoveNext.直到循环结束.
期间GetList()方法只执行一次.
foreach (var a in GetList())
{
...
}
=
var a;
IEnumerator e = GetList().GetEnumerator();
while (e.MoveNext)
{
a = e.Current;
}for 循环靠下标定位. list[3] 相当于 *(list + 3).
for(int i = 0; i < GetCount(); i++)
{
....
}
=
int i = 0;
while(i < GetCount())
{
...
}for 循环每次循环会调用 GetCount() 来比较长度. 而 foreach 不考虑长度,只调用一次GetList().
结论.
在固定长度或长度不需要计算的时候for循环效率高于foreach.
在不确定长度,或计算长度有性能损耗的时候,用foreach比较方便.
并且foreach的时候会锁定集合中的对象.期间不能修改.
你觉得foreach语句使用于什么场景?
for语句在循环语句中有着重要的位置,首先它计算一个初始化序列,然后当某个条件为真时,重复执行嵌套语句并计算一个迭代表达式序列;如果为 False,则退出 for循环, for语句常用于遍历数组集合。
foreach循环专门用来遍历数组和集合的元素,foreach的工作原理是逐个枚举出数组或集合中的每一个元素,只要枚举一个元素就执行一次语句块中的内容,在使用 foreach变量循环的过程中要注意不可以更改遍历中的集合。
扩展资料:
在遍历集合或数组时,如果不使用 for语句,那么 foreach语句是比较好的选择。 foreach语句可以迅速遍历集合或数组,省去 for语句中设置循环起点和循环条件的过程。所以,遍历数组或集合应该优先考虑 foreach语句。
foreach(int index,ref ival;arr){}第一个变量表示数组arr的索引 ival表示数组下标为index对应的值 加了ref关键字表示ival与数组的值相关联(ival改变 数组值也相应改变...类似于C++的引用)。
参考资料来源:
百度百科-foreach
百度百科-for循环
java lambda表达式 foreach
个人理解不喜勿喷。
简单的来说其实三种并没有什么太大的区别,一般情况下的性能也差不多。
for循环:
优点:可以直接获取下标,能更精确的定位。下标变量属于循环内变量,循环结束会自动回收。下标变量的步长可以自定,比较灵活。
缺点:需要根据下标才会获取循环内容。只能循环有序集合和数组,如Set和Map就无法遍历。
增强for:
优点:循环直接进行赋值,直接得到循环对象,不需要通过下标获取。可以遍历所有集合类型和数组。
缺点:循环有序集合时无法定位下标,需要在循环外层定义下标。无法遍历Map类型。
lambda:
优点:可以对所有集合类型和Map进行循环,特别是支持对Map进行循环,循环也是直接进行赋值,直接得到循环对象。
缺点:循环有序集合时无法定位下标,无法遍历数组,因为理论上来说他是属于迭代器的一种。同时因为循环体属于一个封闭范围的线程,在循环体内使用部分循环体外的变量需要加final关键字,很不方便。
另外说到了迭代器,可以参考lambda,不过写法就没lmbda那么方便了,不过迭代器有很多功能是循环比不上的,可以去看看。
foreach和for循环区别
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语句。
以上就是关于foreach和for循环区别 ,foreach和for循环的区别的全部内容,以及foreach和for循环区别 的相关内容,希望能够帮到您。