int数组初始化_Java中到底有没有多维数组
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中到底有没有多维数组相关推荐
- java 创建多维数组_java中如何创建一个多维数组?实例展示
在互联网产业发展的越发如火如荼的今时今日,越来越多的人开始投入到新兴技术的学习当中去.java作为一门十分重要的编程语言,是许多人首选的学习对象.今天就来为大家介绍一下java中如何创建一个多维数组, ...
- java为什么要初始化_JAVA中到底要怎么样初始化
Java中的变量作用范围: 1. 类的属性,或者叫值域 2. 方法里的局部变量 3. 方法的参数 对于第一种变量,Java虚拟机会自动进行初始化.如果给出了初始值,则初始化为该初始值.如果没有给出,则 ...
- java 整形数组初始化_java中怎么数组初始化?
展开全部 当你产生某个存储对象的数组时,真正产生的其实是个存储references的数组.此一数组建立之后,其中62616964757a686964616fe4b893e5b19e3133336564 ...
- java json 二维数组_安卓中使用Gjson解析二维数组
String str = "{\"hot\":[{\"id\":\"1\",\"name\":\"张 ...
- java file数组 初始化_java从文件中读取数据并赋值给数组
从txt文件中读取数据赋值给一维数组 字节流读入字节数组中 字节数组转化为字符串 字符创解析为字符串数组 字符串数组转化为数值,并赋值为数组 文本文件是以字节的形式储存的. 在txt文件中一个数字或者 ...
- java类型的数组初始化_java数组初始化详解
介绍 学习Java的朋友想必对数组并不陌生,它需要使用之前对其进行初始化,这是因为数组是引用类型,声明数组只是声明一个引用类型的变量,并不是数组对象本身,只要让数组变量指向有效的数组对象,程序中就可使 ...
- 1.7 Java到底有没有多维数组?
Java 中没有多维数组的概念,从数组底层的运行机制上来看 Java 没有多维数组,但是 Java 提供了支持多维数组的语法,可以实现多维数组的功能. Java 语言里的数组类型是引用类型,因此数组变 ...
- python定义二维数组_二维数组的定义、初始化和输出,C语言二维数组详解
本节学习二维数组.二维数组与一维数组相似,但是用法上要比一维数组复杂一点.后面的编程中,二维数组用得很少,因为二维数组的本质就是一维数组,只不过形式上是二维的.能用二维数组解决的问题用一维数组也能解决 ...
- Java黑皮书课后题第8章:*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置。返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标
*8.13(定位最大的元素)编写下面的方法,返回二维数组中最大元素的位置.返回值是包含两个元素的一维数组,这两个元素表示二维数组中最大元素的行下标和列下标 题目 题目描述与运行示例 破题 代码 题目 ...
最新文章
- 如何给一个空白磁盘安装操作系统
- l源码安装mysql升级_[Linux]javaEE篇:源码安装mysql
- 蓝桥杯_风险度量(一题多解)
- 计算机 未来哪种技术稀缺,2015级职业生涯规划考试试题
- 【web前端干货】JavaScript是什么?JavaScript有哪些特点?
- python菜鸟教程100例-Python 练习实例4
- 应用数据挖掘进行客户关系管理
- PHP-----文件系统的交互
- STM8L驱动I2C类型的12864
- JavaScript 判断是不是回文字符串
- Error: invalid operands (*UND* and *UND* sections) for `*‘
- 百度SEM/SEO关键词批量自动分词工具
- 【Unicode编码表】UniCode编码表+转化器
- 【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
- 使用JOL工具直接查看出java对象大小
- Linux涂鸦智能网关面板Turnkey方案
- MAGIC: 即插即用、无需训练的图像-文本生成框架
- 创新工厂CEO李开复:互联网的九个产品精神
- Python 控制220V 电源开关??? 老板,你没看错!
- 看懂第一个VEC-C 程序
热门文章
- oracle - emctl start dbconsole
- u-boot命令寻找分析--find_cmd函数
- u-boot的mkconfig文件详解
- 出现java.lang.UnsupportedClassVersionError 错误的原因
- head.s 剖析——Linux-0.11 剖析笔记(五)
- 从源码安装GDB-8.1
- SpringBoot自定义转换器(Convert)
- Exploring the Amazon Echo Dot, Part 2: Into MediaTek utility hell
- EOS从入门到精通-设计背景与DPOS算法(文字稿)
- Xposed源码剖析——app_process作用详解