前言
我们知道在Java中数组属于引用数据类型,它整个数组的数组元素既可以是基本数据类型的(如 byte \ int \ short \ long \ float \ double \ char \ boolean 这些),也可以是引用数据类型的。当它的数组元素是基本数据类型时,这个数组就是一个一维数组;当它的数组元素是引用数据类型时,它就是一个多维数组。比如,在一个数组中它的某个元素值其实是一个一维数组,而其他不同的元素也各自包含了一个一维数组,我们就把这个包含很多个一维数组的数组叫做二维数组。
1、内存中的简化结构
内存也叫做主存,它是计算机五大部件(输入设备、输出设备、运算器、控制器、存储器)中存储器的一部分。在Java中我们可以简单的将 内存分为栈、堆和方法区三部分,其中方法区又包含了常量池和静态域。如下图所示,下面来解释一下这三部分的作用:
栈 属于线性表中的一种,它 具有先进后出的性质,在 Java 中我们 用来存放局部变量,如某方法里的数组名。
堆 它存放的东西其长度、类型不一定相等,一般存放的都是 new 出来的结构,像数组、对象这些。
方法区 可以存放各种我们自定义的方法。
内存的简单结构
2、一维数组
下面我们来通过代码了解一下,一维数组在内存中的表现形式。我们先定义一个ArrayTest类。
public class ArrayTest{ public static void main(String[] args){ //定义三个数组 a[]、b[]、c[] int[] a = new int[]{1,2,3}; float[] b = new float[3]; String[] c = new String[4]; //给特定元素赋值 c[1] = "张三"; c[2] = "李四"; //改变变量指向 c = new String[2]; } }
上面的代码中,我们定义了三个数组 a[ ]、b[ ]、c[ ] 就相当于 在堆开辟了三个各自连续的空间作为数组,如果指定了数组元素的值,则存放的是各个指定的值。如果没有指定,则存放的是默认该数组类型的初始化值,如 b[ ] 。然后会 在栈里依次定义三个变量 a、b、c ,三个变量存放的是各自对应的数组的地址值,如 a 存放的是 0x1234,而堆里该数组的地址是 0x11234 。
给元素赋值的话就相当于用我们指定的值覆盖原有的值。下面我们来重点看一下这一句:
c = new String[2];
原本栈中的 c 变量存放的地址是 0x12ab 的,指向绿色的数组,但是我们 使用了这句话就相当于在堆中又重新开辟了一个数组,并将这个数组的地址赋给了变量 c ,也就是说** c 这个时候的指向变量,不再指向原来的数组了,而是指向了新的数组**。而没有变量指向的原有数组会被 Java 自动回收。这就是一维数组在内存中的表现形式。那么二维数组在内存中又是如何表示的呢?
一维数组在内存中的表现形式
3、二维数组
其实 在底层中并没有二维数组这个概念,我们知道数组是引用数据类型,其元素值可以是基本数据类型,又可以是引用数据类型。所谓的 二维数组其实就相当于我们在内存中开辟了一个数组空间,只不过它的那个元素各自指向一个数组 。
下面我们来举个例子:
public class ArrayTest2{ public static void main(String[] args){ int[][] arr1 = new int[3][]{ {1,2,3},{4,5},{6,7,8,9} }; //这个是二维数组的长度 System.out.println(arr1.length); //这个是二维数组中的某个元素所指向的数组的长度 System.out.println(arr1[2].length); } }
上面的代码中,我们定义了一个二维数组 arr1[ ][ ],并给它初始化了。就相当于我们在堆中开辟了四个一维数组,其中一个一维数组用来存放二维数组的元素,然后由二维数组的元素各自指向一个一维数组。栈中定义了一个变量 arr1 ,存放的是该二维数组的地址,如下图所示。
二维数组在内存中的表现形式
可以看到我们定义的二维数组 arr1[3][0] 其实存放的都是各自元素所指向的元素的地址值。而在栈中存放的则是该数组的地址值。
好了,知道了二维数组在内存的结构,我们便可以知道下面两句代码的值:
//这个是二维数组的长度 System.out.println(arr1.length); //这个是二维数组中的某个元素所指向的数组的长度 System.out.println(arr1[2].length); } }
其中 arr1.length 所指的就是二维数组的长度,那么二维数组的长度是多少呢?答案是 3 。而 arr1[2].length 所指的是该二维数组中第 3 个元素所指向的数组的长度,因此它的值是 4 。这两者的区别需要结合图细细体会。