Java矩形数组中for-each循环输入运行原理与IDE推荐原因咨询
Java矩形数组for-each循环相关问题解答
首先附上问题对应的完整代码:
import java.util.Scanner; public class Recarraysumandmat { public static void main(String[] args) { Scanner kb=new Scanner(System.in); System.out.println("Enter row and column size: "); int n=kb.nextInt(); int m=kb.nextInt(); int sum=0; int [][]arr; arr=new int[n][m]; for (int[] arr1 : arr) { for (int j = 0; j < arr1.length; j++) { arr1[j] = kb.nextInt(); } } for (int[] arr1 : arr) { for (int j = 0; j < arr1.length; j++) { System.out.print(arr1[j] + " "); sum = sum + arr1[j]; } System.out.println(); } System.out.println("The sum is: "+sum); } }
问题1:代码中使用for-each完成矩形数组输入赋值的运行机制
Java中的二维数组本质是「元素为一维数组对象引用的一维数组」,上述代码的赋值逻辑运行流程如下:
- 执行
arr=new int[n][m]时,JVM会在堆内存中创建n个长度为m的int类型一维数组,同时将这n个一维数组的引用按顺序存储在arr这个二维数组中,此时每个一维数组的元素默认值都是0。 - 外层for-each循环
for (int[] arr1 : arr)迭代时,会依次取出arr中存储的每一个一维数组的引用,赋值给临时变量arr1——这里拿到的是原一维数组的引用,不是深拷贝对象。 - 内层使用普通for循环通过索引
j对arr1的元素赋值时,本质是直接修改原二维数组对应的一维数组内部的元素,所以赋值操作会直接生效到原数组中。
问题2:为什么for-each可以用来实现赋值,IDE会推荐优先使用for-each替代普通for循环
首先纠正一个普遍的认知误区:for-each不是完全不能支持赋值操作,只是不能直接修改数组/集合存储的「元素本身的值」,如果元素是引用类型,修改引用指向的对象内部的属性/元素是完全合法且有效的。
你之前学到的「for-each仅适用于遍历、不能用于赋值」的结论,仅适用于一维基础类型数组的场景:比如对int[] a = new int[5]写for(int num : a) {num = 10;}时,临时变量num是数组元素的值拷贝,修改num不会影响原数组,所以这种场景不能用来赋值。
而本次的二维数组场景下,外层for-each拿到的arr1是一维数组的引用(引用类型),你并没有修改arr1这个引用本身的指向,只是修改它指向的一维数组内部的元素,所以操作是有效的。
NetBeans推荐你用外层for-each替代普通for循环的原因有三点:
- 不需要手动维护外层数组的索引变量,完全避免了外层索引越界的风险
- 代码更简洁,可读性更高,不需要额外编写外层索引的计数、边界判断逻辑
- 对于矩形数组、不规则二维数组都通用,不需要提前获取外层数组的长度
注意:该代码的内层循环依旧使用普通for是合理的,因为内层要给int基础类型的元素赋值,如果内层也用for-each拿临时int变量赋值的话,修改就不会生效。
内容的提问来源于stack exchange,提问作者pratik jain
相关产品推荐
相关产品推荐

