我在Java中遇到了一个有趣的夸克。
此代码段将按预期执行(将数组内的所有值更改为0):
int[][] test = {{4, 2, 6}, { 7, 4, 10 }, { 3, 4, 1 } };
for (int[] current : test) {
current[0] = 0;
current[1] = 0;
current[2] = 0;
}
然而,这不会:
int[][] test = {{4, 2, 6}, { 7, 4, 10 }, { 3, 4, 1 } };
for (int[] current : test) {
for (int num : current) {
num = 0;
}
}
感谢任何帮助。提前谢谢。
修改
为了澄清,我理解为什么第二个代码段不起作用。我想知道为什么第一部分有效。谢谢。我不是在寻找“这会起作用”的回应,我想知道第一段与第二段的区别。
答案 0 :(得分:2)
您只对local
变量进行了更改。它不会影响您正在遍历的阵列。
for-each
循环只是一个合成糖,用于循环iterator
。
答案 1 :(得分:2)
for(Iterator<Integer> num = current.iterator(); num.hasNext(); ) {
num = 0;
}
这是foreach扩展时会发生的事情。您需要了解的是,在您的第一个片段中,Iterator迭代一个名为&#34; current&#34;的一维数组,它通过引用传递。因此,当前的任何变化都会反映在&#34; temp&#34;上。但是,int是按值传递的,这就是为什么在你的第二个片段中,&#34; num&#34;没有反映在&#34;当前&#34;。因此,您只需更改与原始数组无关的其他变量的值。尝试打印以下内容以便更好地理解。
int[][] test1 = {{4, 2, 6}, { 7, 4, 10 }, { 3, 4, 1 } };
for (int[] current : test1) {
for (int num : current) {
System.out.println(num);
num = 0;
}
}
答案 2 :(得分:1)
有一个库方法Arrays.fill可以为一维数组设置相同的值。使用它,这样你的代码就会干净而快速。
int[][] test = {{4, 2, 6}, { 7, 4, 10 }, { 3, 4, 1 } };
for (int[] current : test)
Arrays.fill(current, 0);
答案 3 :(得分:0)
这将有效:
int[][] test = {{4, 2, 6}, { 7, 4, 10 }, { 3, 4, 1 } };
for (int[] current : test)
for (int i = 0; i < current.length; i++)
current[i] = 0;