Java 没有多维数组

来源:互联网 发布:淘宝礼服店推荐知乎 编辑:程序博客网 时间:2024/05/20 19:28

本页面更新日期: 2016年07月06日

JAVA语言里提供了支持多维数组的语法.
但如果从数组的底层运行机制上来看,是没有多维数组的.

JAVA语言里的数组类型是引用类型.
因此, 数组变量其实是一个引用, 这个引用指向真实的数组内存.
数组元素的类型也可以是引用,如果数组元素的引用再次指向真实的数组内存, 这种情形看上去就像多维数组.

不过首先, 我有个疑问, 什么是多维数组? 看了这个之后, 我大概明白了, 所谓的多维数组就是 数组套数组呗… 说的概念好高大上. 其实就是这么个东西. 就像我们之前学习过的循环, 也是可以互相嵌套的一样.

回到前面定义数组类型的语法: type[] arrName; 这是典型的一维数组的定义语法.
其中 type 是数组元素的类型.
如果希望数组元素也是引用, 而且是指向 int 数组的引用, 则可以把 type 具体成 int[] 那么上面定义数组的语法就是 int[][]arrName;

JAVA采用上面的语法格式来定义二维数组, 但它实质还是一维数组, 只是其数组元素也是引用, 数组元素里保存的引用指向一维数组.

接着对这个 二维数组 执行初始化.
arrName = new type[length][]
上面的初始化语法相当于初始化了一个一维数组, 这个一维数组的长度是 length .
同样, 因为这个一维数组的数组元素是引用类型. 所以系统为每个数组元素都分配了初始值: null

这个二维数组实际上完全可以当成一维数组使用: 使用 new type[length] 初始化一维数组后, 相当于定义了 length 个 type 类型的变量; 类似的, 使用 new type[length][] 初始化这个数组后, 相当于定义了 length 个 type[] 类型的变量, 当然, 这些 type[] 类型的变量都是数组类型, 因此必需再次初始化这些数组.

下面, 我们写一个程序, 试试把 二维数组 当成 一维数组 来处理.

public class TwoDimensionTest{  public static void main(String[] args)  {    // 定义一个 二维数组    int[][] a;    // 把 a 当成一维数组进行初始化, 初始化 a 是一个长度为 4 的数组    // a 数组的数组元素又是引用类型    a = new int[4][];    // 把 a 数组当成一维数组, 遍历 a 数组的每个数组元素    for (int i = 0, len = a.length; i < len; i++)    {      System.out.println(a[i]);    }    // 让我们先写一个间隔, 用于程序运行后查看相关的结果来理解二维数组    System.out.println("我是一个小间隔,啦啦啦");    // 初始化 a 数组的第一个元素    a[0] = new int[2];    // 访问 a 数组的第一个元素所指数组的第二个元素    a[0][1] = 6;    // a 数组的第一个元素时一个一维数组, 遍历这个一维数组    for(int i = 0, len = a[0].length; i < len; i++)    {      System.out.println(a[0][i]);    }  }}

当你看到输出的结果后, 好好想一想, 其实你能明白是啥意思的. 我相信你!
下面, 我们再用示意图来看看这里到底发生了什么.

程序的第一行 int[][]a; 将在栈内存中定义一个引用变量, 这个变量并未指向任何有效的内存空间, 此时的堆内存中还未为这行代码分配任何存储区域.

接着, 程序对 a 数组执行初始化: a = new int[4][]; 这行代码让 a 变量指向一块长度为 4 的数组元素, 这个长度为 4 的数组里 每个数组元素 都是引用类型.
这时如下图:

这里写图片描述

从上图可以看出, 虽然声明 a 是一个二维数组, 但这里丝毫看不出 它 是一个二维数组的样子, 完全是一个 一维数组的样子.
这个一维数组的长度是 4, 只是这 4 个数组的元素都是引用类型. 它们的默认值是 null.
所以程序中可以把 a 数组当成一维数组进行处理, 遍历 a 数组的每个元素, 将得到每个数组元素的值 都是 null 的结果.

由于 a 数组的元素必需是 int[] 数组, 所以接下来的程序对 a[0] 元素执行初始化, 让这个数组元素指向一个有效的数组内存, 指向一个长度为 2 的 int 数组.
因为程序采用动态初始化 a[0] 数组, 因此系统将为 a[0] 所引用数组的每个元素分配默认的初始值: 0.
然后程序显式的为 a[0] 数组的第二个元素赋值为 6 . 此时在内存中的存储示意图如下:

这里写图片描述

接着程序输出 a[0] 数组的每个数组元素, 你将会看到输出 0 和 6.
不要着急, 慢慢理解哦. 理解后我们继续往下看.

其实我们可以一次指定每一维的大小. 例如下面代码

// 同时初始化二维数组的两个维数int[][] b = new int[3][4];

上面代码将定义一个 b 数组变量, 这个数组变量指向一个长度为 3 的数组, 这个数组的每个数组元素又是一个数组类型, 它们各自指向长度为 4 的 int[] 数组.
这行代码的示意图如下:

这里写图片描述

总而言之呢, 我们可以得出一个结论.
二维数组是一维数组, 其数组元素是一维数组;
三维数组也是一维数组, 其数组元素是二维数组…. 从这个角度来看的话.
的确 java 语言没有多维数组.

结尾

如果你想学习更多Java知识, 可以 点我进入目录页

0 0
原创粉丝点击