在代码中
for (int i: array){
您声明一个变量i
,在每次循环迭代时获取数组中下一个元素的值,它不是对该元素的引用。
在
i = 1;
您将新值分配给变量,而不是数组中的元素。
您不能直接使用 foreach 循环设置数组元素的值。为此使用正常for
循环
for (int i = 0; i < array.length; i++) {
array[i] = ...; // some value
}
在上面的示例中,您使用声明的变量i
作为数组中元素的索引。
array[i]
正在访问可以修改其值的元素本身。
Ans 显然未能将 1 分配给数组的每个元素。我添加了 System.out.print(i); 到循环的主体并看到屏幕的输出是 1111111111 但是由于在循环内对 i 执行某些操作是有效的,因此 i 很可能是数组每个元素的副本,不是吗?(第一个问题)
你必须把 the 放在 theSystem.out.print(i)
之后i = 1
,否则你会得到0000000
。
如果上述情况属实,这是否意味着 foreach 循环比普通 for 循环慢得多,因为它涉及复制数组的每个元素?或者由于 Java 没有指针和指针算法,所以 oprator[] 可能以其他“糟糕”的方式设计,即复制每个元素实际上更快?
看看这里,看看 foreach 循环是如何工作的。对于数组,
for (int i: array){
i = 1;
}
相当于
for (int index = 0; index < array.length; index++) {
int i = array[index];
i = 1;
}
所以速度并不慢。您正在堆栈上进行另一项原始创建。
这取决于实施。对于数组,它不会以任何方式变慢。它只是用于不同的目的。
为什么要使用明显较慢的 foreach 循环而不是常见的 forloop?
一个原因是可读性。另一个是当您不关心更改数组的元素引用,而是使用当前引用时。
以引用类型为例
public class Foo {
public int a;
}
Foo[] array = new Foo[3];
for (int i = 0; i < array.length; i++) {
array[i] = new Foo();
array[i].a = i * 17;
}
for (Foo foo : array) {
foo.a = 0; // sets the value of `a` in each Foo object
foo = new Foo(); // create new Foo object, but doesn't replace the one in the array
}
对于原始类型,这样的事情是行不通的。
for (int index = 0; index < array.length; index++) {
int i = array[index];
i = 1; // doesn't change array[index]
}