Java 中没有多维数组的概念,从数组底层的运行机制上来看 Java 没有多维数组,但是 Java 提供了支持多维数组的语法,可以实现多维数组的功能。

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

定义数组类型的语法type[] arrName;是典型的一维数组的定义语法,其中 type 是数组元素的类型。如果希望数组元素也是一个引用,而且是指向 int 数组的引用,则可以把 type 具体成 int[](前面已经指出,int[] 就是一种类型,int[] 类型的用法与普通类型并无任何区别),那么上面定义数组的语法就是int[][] arrName

如果把 int 这个类型扩大到 Java 的所有类型(不包括数组类型),则出现了定义二维数组的语法:

type[][] arrName;

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

接着对这个“二维数组”执行初始化,同样可以把这个数组当成一维数组来初始化,把这个“二维数组”当成一个一维数组,其元素的类型是 type[] 类型,则可以采用如下语法进行初始化:

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]); // 输出 null null null null}// 初始化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]); // 输出 0 6}}
}

上面程序中粗体字代码部分把 a 这个二维数组当成一维数组处理,只是每个数组元素都是 null,所以看到输出结果都是 null。下面结合示意图来说明这个程序的执行过程。

程序中代码int[][] a;

将在栈内存中定义一个引用变量,这个变量并未指向任何有效的内存空间,此时的堆内存中还未为这行代码分配任何存储区。

程序中代码a = new int[4][];对 a 数组执行初始化,这行代码让 a 变量指向一块长度为 4 的数组内存,这个长度为 4 的数组里每个数组元素都是引用类型(数组类型),系统为这些数组元素分配默认的初始值:null。此时 a 数组在内存中的存储示意图如图 1 所示。

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

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

图 2 中灰色覆盖的数组元素就是程序显式指定的数组元素值。TwoDimensionTest.java 接着迭代输出 a[0] 数组的每个数组元素,将看到输出 0 和 6。

是否可以让图 2 中灰色覆盖的数组元素再次指向另一个数组?这样不就可以扩展成三维数组,甚至扩展成更多维的数组嘛?

不能!至少在这个程序中不能。因为 Java 是强类型语言,当定义 a 数组时,已经确定了 a 数组的数组元素是 int[] 类型,则 a[0] 数组的数组元素只能是 int 类型,所以灰色覆盖的数组元素只能存储 int 类型的变量。对于其他弱类型语言,例如 JavaScript 和 Ruby 等,确实可以把一维数组无限扩展,扩展成二维数组、三维数组......,如果想在 Java 语言中实现这种可无限扩展的数组,则可以定义一个 Object[] 类型的数组,这个数组的元素是 Object 类型,因此可以再次指向一个 Object[] 类型的数组,这样就可以从一维数组扩展到二维数组、三维数组......

从上面程序中可以看出,初始化多维数组时,可以只指定最左边维的大小;当然,也可以一次指定每一维的大小。例如下面代码:

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

上面代码将定义一个 b 数组变量,这个数组变量指向一个长度为 3 的数组,这个数组的每个数组元素又是一个数组类型,它们各指向对应的长度为 4 的 int[] 数组,每个数组元素的值为 0。这行代码执行后在内存中的存储示意图如图 3 所示。

还可以使用静态初始化方式来初始化二维数组。使用静态初始化方式来初始化二维数组时,二维数组的每个数组元素都是一维数组,因此必须指定多个一维数组作为二维数组的初始化值。如下代码所示:

// 使用静态初始化语法来初始化一个二维数组
String[][] str1 = new String[][]{new String[3], new String[]{"hello"}};
// 使用简化的静态初始化语法来初始化二维数组
String[][] str2 = {new String[3], new String [] {"hello"}};

上面代码执行后内存中的存储示意图如图 4 所示。

通过上面讲解可以得到一个结论:二维数组是一维数组,其数组元素是一维数组。三维数组也是一维数组,其数组元素是二维数组…… 从这个角度来看,Java 语言里没有多维数组。

int数组初始化_Java中到底有没有多维数组相关推荐

  1. java 创建多维数组_java中如何创建一个多维数组?实例展示

    在互联网产业发展的越发如火如荼的今时今日,越来越多的人开始投入到新兴技术的学习当中去.java作为一门十分重要的编程语言,是许多人首选的学习对象.今天就来为大家介绍一下java中如何创建一个多维数组, ...

  2. java为什么要初始化_JAVA中到底要怎么样初始化

    Java中的变量作用范围: 1. 类的属性,或者叫值域 2. 方法里的局部变量 3. 方法的参数 对于第一种变量,Java虚拟机会自动进行初始化.如果给出了初始值,则初始化为该初始值.如果没有给出,则 ...

  3. java 整形数组初始化_java中怎么数组初始化?

    展开全部 当你产生某个存储对象的数组时,真正产生的其实是个存储references的数组.此一数组建立之后,其中62616964757a686964616fe4b893e5b19e3133336564 ...

  4. java json 二维数组_安卓中使用Gjson解析二维数组

    String str = "{\"hot\":[{\"id\":\"1\",\"name\":\"张 ...

  5. java file数组 初始化_java从文件中读取数据并赋值给数组

    从txt文件中读取数据赋值给一维数组 字节流读入字节数组中 字节数组转化为字符串 字符创解析为字符串数组 字符串数组转化为数值,并赋值为数组 文本文件是以字节的形式储存的. 在txt文件中一个数字或者 ...

  6. java类型的数组初始化_java数组初始化详解

    介绍 学习Java的朋友想必对数组并不陌生,它需要使用之前对其进行初始化,这是因为数组是引用类型,声明数组只是声明一个引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可使 ...

  7. 1.7 Java到底有没有多维数组?

    Java 中没有多维数组的概念,从数组底层的运行机制上来看 Java 没有多维数组,但是 Java 提供了支持多维数组的语法,可以实现多维数组的功能. Java 语言里的数组类型是引用类型,因此数组变 ...

  8. python定义二维数组_二维数组的定义、初始化和输出,C语言二维数组详解

    本节学习二维数组.二维数组与一维数组相似,但是用法上要比一维数组复杂一点.后面的编程中,二维数组用得很少,因为二维数组的本质就是一维数组,只不过形式上是二维的.能用二维数组解决的问题用一维数组也能解决 ...

  9. Java黑皮书课后题第8章:*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置。返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标

    *8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置.返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标 题目 题目描述与运行示例 破题 代码 题目 ...

最新文章

  1. 如何给一个空白磁盘安装操作系统
  2. l源码安装mysql升级_[Linux]javaEE篇:源码安装mysql
  3. 蓝桥杯_风险度量(一题多解)
  4. 计算机 未来哪种技术稀缺,2015级职业生涯规划考试试题
  5. 【web前端干货】JavaScript是什么?JavaScript有哪些特点?
  6. python菜鸟教程100例-Python 练习实例4
  7. 应用数据挖掘进行客户关系管理
  8. PHP-----文件系统的交互
  9. STM8L驱动I2C类型的12864
  10. JavaScript 判断是不是回文字符串
  11. Error: invalid operands (*UND* and *UND* sections) for `*‘
  12. 百度SEM/SEO关键词批量自动分词工具
  13. 【Unicode编码表】UniCode编码表+转化器
  14. 【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
  15. 使用JOL工具直接查看出java对象大小
  16. Linux涂鸦智能网关面板Turnkey方案
  17. MAGIC: 即插即用、无需训练的图像-文本生成框架
  18. 创新工厂CEO李开复:互联网的九个产品精神
  19. Python 控制220V 电源开关??? 老板,你没看错!
  20. 看懂第一个VEC-C 程序

热门文章

  1. oracle - emctl start dbconsole
  2. u-boot命令寻找分析--find_cmd函数
  3. u-boot的mkconfig文件详解
  4. 出现java.lang.UnsupportedClassVersionError 错误的原因
  5. head.s 剖析——Linux-0.11 剖析笔记(五)
  6. 从源码安装GDB-8.1
  7. SpringBoot自定义转换器(Convert)
  8. Exploring the Amazon Echo Dot, Part 2: Into MediaTek utility hell
  9. EOS从入门到精通-设计背景与DPOS算法(文字稿)
  10. Xposed源码剖析——app_process作用详解