增强for循环 (for each)

3月7日 · 2018年

for each

增强for循环是java与C++11中都存在的一种循环写法。它利用数据结构中的迭代器来遍历数据结构中的元素。

在java中写法为: for (Object x: y) {}

在c++中写法为: for (auto x: y) {}

只要在数据结构中迭代器begin(), end() 等都已定义好,则可以使用for each写法代替之前的迭代器遍历写法。即可以理解为,下面两种for循环是完全一样的:

通过反汇编可以发现这两种循环的实现方式几乎是完全一致的。经测试,它们所消耗的时间也几乎是完全一样的。故由代码简洁性考虑,推荐用for each写法代替迭代器写法。

而对于下标递增遍历的方式,除了在遍历处理过程中需要利用到下标的函数与方法,在此均推荐使用for each写法来代替该写法。

对于数组类型的顺序结构(如ArrayList),for each写法运行效率会比下表写法略微缓慢一点,不过常数非常小,正常情况下是可以忽略的。而for each写法的简洁使得它的可读性更强。

对于非顺序结构(如LinkedList),下标对应元素的.get()函数对应的时间复杂度不再是O(1),而是O(n),即每次从头开始遍历,直到下标与当前元素对应。对于整个数组的遍历,.get()函数均摊复杂度仍为线性的O(n/2),遍历总复杂度O(n^2)。而for each写法遍历复杂度仍为O(n),与下标写法差距非常大。

综上,for each写法是一种不需要利用元素下标时绝佳的遍历写法。

相关文章
暂无相关文章!
0 条回应
验证码
输入运算符及数字使等式成立
{{comment.validate_num1}} = {{comment.validate_num2}}
点赞确定
退出登录?
取消 确定