int[][] a = {} 和 int[][] a = {{}}
观察代码
package week04.g20200343040172;
public class Main {
public static void main(String[] args) {
int[][] a = {};
int[][] b = {{}};
System.out.println("a.length: " + a.length);
try {
System.out.println("a[0].length: " + a[0].length);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Is a equals null?: " + (a == null));
System.out.println("b.length: " + b.length);
System.out.println("b[0].length: " + b[0].length);
System.out.println("Is b equals null?: " + (b == null));
}
}
打印结果
System.out.println("a[0].length: " + a[0].length) 为第九行,报错!!
a.length: 0
Is a equals null?: false
b.length: 1
b[0].length: 0
Is b equals null?: false
java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at week04.g20200343040172.Main.main(Main.java:9)
a.length和 a[0].length
对于二维数组
int[][] a = {};
int[][] b = {{}};
- a.length打印的是二维矩阵的行的数量,对于M×N的数组而言,a.length对应的就是M。可以把一行看成一个整体,一个二维数组有多少行,里面就有多少个元素。这么来看的话,其实就可以把二维数组当成一个一维数组。
- a[0].length打印的是二维矩阵的列的数量,对于M×N的数组而言,a[0].length对应的就是N。
- 对于 int[ ][ ] a = { }。如果我们把一行看作一个元素的话,现在里面完完全全就是空的。我们想当然认为a[0]表示第一行的元素,但是此时里面根本就没有初始化,索引0对应的是哪块区域,索引1对应的是哪块区域,根本就没有划分出来,于是,用索引0去寻找a[0]这个元素的时候,会发现什么都找不到。因为根本就没有a[0]这个元素。对应于下面的一维数组,同样也是如此。
int ] c = { };
System.out.println("c.length: " + c.length); //打印0
System.out.println(c[0]); // ArrayIndexOutOfBoundsException
int[] d = new int[10];
System.out.println("d.length: " + d.length); //打印10
System.out.println(d[0]); //打印0
- 对于int[ ][ ] b = {{ }}。同样的,我们如果把一行看作一个元素的话,里面有一个空的括号,表示该行什么元素都没有,但是与int[ ][ ] a = { }不同的是,虽然b里面第一个元素为空,但是b为第一行的元素也就是b[0]已经分配了一块地址,它告诉程序员:“好了,我已经为第一行的元素腾出来一块空间,你赶紧把元素放进来吧。"虽然此时的b[0]里面没有放任何元素,但是起码b[0]是有名有姓的。所以b[0].length不会出错。
而int[ ][ ] a = { }却根本就没有为a[0]这个元素开辟空间,连a[0]是谁,对于a这个二维数组而言都不知道。所以用a[0].length会出错。
二维的List
类比于上面的二维数组,二维的List就可以这么写:
List<List<Integer>> list = new ArrayList<>();
list.get(0).add(1); //为二维list里面的第一个list添加一个元素1
转载:https://blog.csdn.net/qq_42799615/article/details/105519048
查看评论