在代码中
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 是每个元素的副本
数组,不是吗? (第一个问题)
你必须把System.out.print(i)放在i = 1之后,否则你会得到0000000。
如果上述情况属实,这是否意味着 foreach 循环很多
比常见的 for 循环慢,因为它涉及复制
数组的每个元素?或者因为 Java 没有指针和
指针算法,操作符 [] 可以设计成其他的
复制每个元素实际上更快的“糟糕”时尚?
查看here 以了解 foreach 循环的工作原理。对于数组,
for (int i: array){
i = 1;
}
等价于
for (int index = 0; index < array.length; index++) {
int i = array[index];
i = 1;
}
所以它并不慢。您正在堆栈上进行另一项原始创建。
这取决于实现。对于数组,它不会以任何方式变慢。它只是用于不同的目的。
为什么要使用明显较慢的 foreach 循环而不是普通循环
循环?
一个原因是可读性。另一个是当您不关心更改数组的元素引用,而是使用当前引用时。
以引用类型为例
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]
}