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知识, 可以 点我进入目录页
- Java 没有多维数组
- Java多维数组详解
- JAVA中的多维数组
- java 多维数组
- Java多维数组遍历
- java多维数组遍历
- Java 多维数组遍历
- Java 多维数组遍历
- 【JAVA】19、多维数组
- Java 多维数组遍历
- Java 多维数组遍历
- java多维数组
- Java多维数组
- java中的多维数组
- JAVA定义多维数组
- java:多维数组赋值
- java数组-二维数组及多维数组
- 慎用java的多维数组
- C#中List<T>的用法
- DownloadManager+Rxjava实现显示进度的文件下载
- 信息计量学结课论文
- 直播平台的高并发架构设计3-方案
- I2C 日记
- Java 没有多维数组
- java调用perl脚本中cat和more命令的执行结果
- Python学习之路(Win7)之Python核心编程
- 乱世佳人 - 电影史上的不朽名作
- (2) tcpdump -r nictracefile_2 > nictracefile_2.txt
- java-OOP-抽象类和接口
- CRectTracker类的使用方法
- ubuntu14.04 pip从1.5.4 升级到8.x最新版
- mysql Access denied for user root@localhost错误解决方法总结