Java 如何增强for循环

Java 如何增强for循环,java,jquery,c++,performance,for-loop,Java,Jquery,C++,Performance,For Loop,我使用sublime text作为我的文本编辑器,并且我一直在编写我的for循环,如下所示: for(inti=0;i=0;i--){} 我非常好奇这是如何“增强”的,这样我就可以知道,对于任何其他可能好奇的人来说?我不确定“增强for循环”是什么。每当我听到enhanced for loop时,我就会想到这样的事情。我不确定“enhanced for loop”是什么。每当我听到enhanced for loop时,我都会想到这样的事情。这是旧编译器和解释器(在旧芯片架构上)的一种保留,它的加

我使用sublime text作为我的文本编辑器,并且我一直在编写我的for循环,如下所示:

for(inti=0;i

最近我在查看编辑器的代码提示,我注意到它说“Enhaced for Loop”,它向我展示了这一点:

for(int i=lengthOfSomething-1;i>=0;i--){}


我非常好奇这是如何“增强”的,这样我就可以知道,对于任何其他可能好奇的人来说?

我不确定“增强for循环”是什么。每当我听到enhanced for loop时,我就会想到这样的事情。

我不确定“enhanced for loop”是什么。每当我听到enhanced for loop时,我都会想到这样的事情。

这是旧编译器和解释器(在旧芯片架构上)的一种保留,它的加法速度略慢于减法

现代编译器和解释器(加上现代芯片架构)确实没有这个问题


有关此问题的更多详细信息,请参阅。

这是旧编译器和解释器(在旧芯片架构上)的遗留问题,它们的加法速度略慢于减法

现代编译器和解释器(加上现代芯片架构)确实没有这个问题

有关此问题的更多详细信息,请参阅。

,如下所示:-

单步遍历数组中所有元素的常用方法 顺序是以“标准”为循环 ,例如

for (int i = 0; i < myArray.length; i++) {
    System.out.println(myArray[i]);
}
增强的for循环是在Java5中引入的,它是迭代集合的所有元素的一种更简单的方法(这些页面中不包括集合)。它也可以用于数组,如上面的示例所示,但这不是最初的目的

增强型for循环简单但不灵活。当您希望按从头到尾的顺序逐步遍历数组的元素,并且不需要知道当前元素的索引时,可以使用它们。在所有其他情况下,循环的“标准” 应优先考虑。 另外两种语句类型,
break
continue
,还可以控制增强forloops的行为

高级

break和continue语句可以与语句标签一起使用

。有关更多信息:-

如图所示:

单步遍历数组中所有元素的常用方法 顺序是以“标准”为循环 ,例如

for (int i = 0; i < myArray.length; i++) {
    System.out.println(myArray[i]);
}
增强的for循环是在Java5中引入的,它是迭代集合的所有元素的一种更简单的方法(这些页面中不包括集合)。它也可以用于数组,如上面的示例所示,但这不是最初的目的

增强型for循环简单但不灵活。当您希望按从头到尾的顺序逐步遍历数组的元素,并且不需要知道当前元素的索引时,可以使用它们。在所有其他情况下,循环的“标准” 应优先考虑。 另外两种语句类型,
break
continue
,还可以控制增强forloops的行为

高级

break和continue语句可以与语句标签一起使用

。有关更多信息:-


与第二个
for
循环相比,第一个
for
循环包含在每次迭代时执行的附加加载操作(当CPU加载变量
lengthOfSomething的值时)

话虽如此,如果启用编译器优化,可能会消除此加载操作,因为变量
lengthOfSomething
的值在整个循环执行过程中保持不变


通过比较每个循环的反汇编代码,您可能能够更好地理解这一点

在第一个循环中,每次迭代都会执行以下操作:

mov eax,dword ptr [i]
add eax,1
mov dword ptr [i],eax
mov eax,dword ptr [i]
cmp eax,dword ptr [lengthOfSomething]
mov eax,dword ptr [i]
sub eax,1
mov dword ptr [i],eax
cmp dword ptr [i],0
在第二个循环中,每次迭代都会执行以下操作:

mov eax,dword ptr [i]
add eax,1
mov dword ptr [i],eax
mov eax,dword ptr [i]
cmp eax,dword ptr [lengthOfSomething]
mov eax,dword ptr [i]
sub eax,1
mov dword ptr [i],eax
cmp dword ptr [i],0
如您所见,第一个循环包含附加的
moveax、dwordptr[i]
操作。这是因为CPU体系结构支持比较内存内容和常量,但不支持比较两个内存内容。请注意,上面示例中的反汇编代码是由微软Visual C++ 2010编译器生成的,编译器优化被禁用。但有理由假设其他编译器会生成类似的反汇编代码



好的,在上面的例子中,实际的改进是由于第一个循环比较两个变量(因此其中一个必须加载到寄存器),而第二个循环比较一个变量和一个常量(CPU架构支持的操作)。但是它仍然具有一般的推理,即与第一个循环相比,第二个循环中的变量访问操作更少。

for
的第一个
循环与for
的第二个
循环相比,包含在每次迭代时执行的额外加载操作(当CPU加载变量
lengthOfSomething
的值时)

话虽如此,如果启用编译器优化,可能会消除此加载操作,因为变量
lengthOfSomething
的值在整个循环执行过程中保持不变


通过比较每个循环的反汇编代码,您可能能够更好地理解这一点

在第一个循环中,每次迭代都会执行以下操作:

mov eax,dword ptr [i]
add eax,1
mov dword ptr [i],eax
mov eax,dword ptr [i]
cmp eax,dword ptr [lengthOfSomething]
mov eax,dword ptr [i]
sub eax,1
mov dword ptr [i],eax
cmp dword ptr [i],0
在第二个循环中,每次迭代都会执行以下操作:

mov eax,dword ptr [i]
add eax,1
mov dword ptr [i],eax
mov eax,dword ptr [i]
cmp eax,dword ptr [lengthOfSomething]
mov eax,dword ptr [i]
sub eax,1
mov dword ptr [i],eax
cmp dword ptr [i],0
如您所见,第一个循环包含额外的
mov eax,dword ptr[i]
操作。这是因为CPU体系结构支持内存比较