昨天遇到了三维数组初始化的问题,代码如下,
int[][][] arr = new int[2][][];
arr[1] = new int[][]{{1,2}, {3,4}, {5,6}};//这里出问题了
研究了一下后有所收获,思考过程都在代码注释中,主要是快速初始化和匿名数组的问题。这里只是找到了一个可以编译的写法,盲人摸象,想要高屋建瓴的理解还是去了解Java编译器和虚拟机。
import java.util.Arrays;
public class Test
{
public static void main(String[] args)
{
//声明了一个数组变量,但是这个变量还没有初始化,
// 也就是说没有指向任何内存,甚至连null都不是,此时还不能使用
int[] a;
a = null;//数组也是对象,将a初始化为null
System.out.println(Arrays.toString(a));
a = new int[5];//将a初始化为一个长度为5的整型数组,数组中的元素默认初始化为0
System.out.println(Arrays.toString(a));
a = new int[]{1, 2, 3, 4, 5};//创建了一个匿名数组,并将a指向这个匿名数组
System.out.println(Arrays.toString(a));
//这是创建数组对象并同时赋值的简化书写形式,不需要调用new,也不能调用new
int[] smallPrimes = {2, 3, 5, 7, 11};
System.out.println(Arrays.toString(smallPrimes));
/*
* java中没有多维数组,也就是说arr表示引用一个数组,这个数组中存放的应该是int[][]型的引用
* 但是这个时候arr没有初始化,它甚至连null都不是
* */
int[][][] arr = new int[2][][];
/* new int[2][][]将在堆中开辟内存,内存的大小为两个int[][]型引用的长度
* 默认初始化为null,也就是说arr[0]和arr[1]都是null
* 如果要给arr[0]赋值,需要赋一个int[][]型的引用值,
* 像下面这样*/
arr[0] = new int[3][3];
/*
* 下面是创建一维数组对象并同时赋值的简化书写形式,
* 不需要调用new,也不能调用new
*int[] smallPrimes = {2, 3, 5, 7, 11};
* 如果想要像这样给arr[1]赋值,应该已经没有机会了
*
* 下面是通过创建匿名数组初始化一维数组a
* a = new int[]{1, 2, 3, 4, 5};//创建了一个匿名数组,并将a指向这个匿名数组
* 如果是想要像这样给arr[1]赋值,考虑如何创建二维匿名数组
*首先明确,二维数组中存放的是一维数组的引用,仿照一维数组的形式,
* 在大括号中创建匿名一维数组就可以了*/
arr[1] = new int[][]{new int[]{1, 2}, new int[]{3, 4}, new int[3], {}};
System.out.println(Arrays.deepToString(arr));//查看arr的内容,是不规则数组
}
}