foreach Java“for each”循环是如何工作的?
考虑:
List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList
for (String item : someList) {
System.out.println(item);
}
如果不对每个语法使用,那么等效的for
循环会是什么样子
你可以在下面搜索框中键入要查询的问题!
考虑:
List<String> someList = new ArrayList<String>();
// add "monkey", "donkey", "skeleton key" to someList
for (String item : someList) {
System.out.println(item);
}
如果不对每个语法使用,那么等效的for
循环会是什么样子
# 1 楼答案
Java中的for-each循环使用底层迭代器机制。因此,它与以下内容相同:
# 2 楼答案
这里有一个答案,它并不假定您了解Java迭代器。它不太精确,但对教育很有用
编程时,我们通常编写如下代码:
foreach语法允许以更自然、更少语法噪音的方式编写此公共模式
此外,此语法对于不支持数组索引但实现Java Iterable接口的列表或集合等对象有效
# 3 楼答案
在Java 5中添加的for-each loop(也称为“增强的for循环”),相当于使用^{} ——它是相同事物的语法糖。因此,在逐项按顺序读取每个元素时,应始终在迭代器上选择一个for-each,因为它更方便、更简洁
对于每个
迭代器
在某些情况下,您必须直接使用
Iterator
。例如,在为每个can(will?)使用时尝试删除一个元素结果是ConcurrentModificationException
For each与For循环:基本区别
for循环和for each之间唯一实际的区别是,对于可索引对象,您无权访问索引。需要基本for循环时的示例:
尽管您可以手动创建一个单独的索引int变量
。。。不建议这样做,因为variable-scope并不理想,基本
for
循环只是这个用例的标准和预期格式For each与For循环:性能
访问集合时,for each比基本
for
循环的数组访问权限大significantly faster。然而,当访问数组时——至少在使用原语和包装器数组时——通过索引进行访问的速度要快得多对基本int数组的迭代器和索引访问之间的差异进行计时
在访问
int
或Integer
数组时,索引比迭代器快23-40。这是本文底部测试类的输出,它对100个元素的原始int数组中的数字求和(a是迭代器,B是索引):我还为一个
Integer
数组运行了这个程序,索引仍然是明显的赢家,但速度仅在18%到25%之间对于集合,迭代器比索引快
然而,对于
List
中的Integers
,迭代器显然是赢家。只需将测试类中的int数组更改为:并对测试函数进行必要的更改(
int[]
到List<Integer>
,length
到size()
,等等):在一个测试中,它们几乎是等价的,但对于集合,迭代器获胜
*本文基于我对堆栈溢出的两个回答:
Uses and syntax for for-each loop in Java
Should I use an Iterator or a forloop to iterate?
更多信息:Which is more efficient, a for-each loop, or an iterator?
完整的测试等级
我在阅读了堆栈溢出上的this question之后,创建了这个比较类来做任何两件事所需的时间:
# 4 楼答案
请注意,如果需要在循环中使用
i.remove();
,或者以某种方式访问实际的迭代器,则不能使用for ( : )
习惯用法,因为实际的迭代器只是推断出来的正如Denis Bueno所指出的,此代码适用于实现^{} interface 的任何对象
此外,如果
for (:)
习惯用法的右侧是array
而不是Iterable
对象,则内部代码使用一个int索引计数器并检查array.length
。见Java Language Specification# 5 楼答案
如JLS中所定义,每个循环可以有两种形式:
如果表达式的类型是
Iterable
的子类型,则翻译如下:如果表达式必须具有数组类型
T[]
,则:Java8引入了流,这些流在使用下降大小数据集时通常表现得更好。我们可以将其用作:
# 6 楼答案
每个的构造也适用于数组。e、 g
这基本上相当于
因此,总体总结:
[nsayer]下面是正在发生的事情的较长形式:
[Denis Bueno]