黑马程序员技术交流社区

标题: java 中不存在真正的二维数组 详解 [打印本页]

作者: 洪伟    时间: 2015-6-17 14:43
标题: java 中不存在真正的二维数组 详解
         ava是不存在真正的2维数组的。例如:int[][] a = new a[100][100],a是一个引用变量,而a所指向的一位数组也是引用变量,每个数组元素指向一组长度相同属性相同的一维数组。下面代码就是将二维数组当作一位数组处理的结果,结果证明 java 不存在二维数组

ps:下面代码放在main函数里是可以运行的


           int[][] a;
           a = new int[4][];//把2为数组当作一维数组初始化
           for(int i=0;i<a.length;i++){
              System.out.println(a[i]);
     }
           a[0] = new int[2];//指定数组
           for(int i=0;i<2;i++){
             a[0][i]=i;
             System.out.println(a[0]);//打印一个看不东的东西,其实是个int型数组的引用 [I
             int[] sss = a[0];//根据java的栈堆内存原理,把引用直接赋给一个一位数组
             System.out.println(sss[i]+"这时sss");//打印一维数组的值
             System.out.println("==============================");
             System.out.println(a[0][i]+"这时2维数组");//打印二维数组的值,会发现与sss的值是一样的
     }
作者: 黑色柳丁    时间: 2015-6-17 14:55
那你理解的二维数组是怎么样的。
作者: 黑色柳丁    时间: 2015-6-17 14:57
二维数组
二维数组本质上是以数组作为数组元素的数组,即“数组的数组”。

作者: 洪伟    时间: 2015-6-17 15:04
黑色柳丁 发表于 2015-6-17 14:55
那你理解的二维数组是怎么样的。

以int[][] 为例   int[][] a = new int[2][2],这时一个2*2的2维数组。但是其本质角度上来讲 是由3个一位数组组成。首先  a 本事 是个指向有两个数组元素的一维数组的引用,数组元素类型为 int[] 的引用。a[0]和a[1]就是它的元素,a[0],a[1] 都指向一个int[2]类型的数组。这样就形成了一个2维数组,但是本质上是一维数组。
作者: 黑色柳丁    时间: 2015-6-17 15:11
噗。。。其中两个1维数组装的元素是int型的,而一个1维数组装的元素是另外两个1维数组的地址。
二位数组的定义本来就是以数组作为数组元素的数组,而在Java中数组就是通过地址值表示的。
照你这么说,所有语言中都不存在二位数组咯。
作者: 黑色柳丁    时间: 2015-6-17 15:13
当一维数组的元素是非数组类型的时候称为一维数组,当一维数组的元素是一维数组时他就叫做二维数组。二维数组在官方定义中本来就是一种特殊的一维数组。
作者: 逝....曾经    时间: 2015-6-17 16:59
二维数组就是由一维数组组成的,你这样有点挑骨头啦,其实所有的事物都是由小事物组成的,之所以叫他二维数组,是因为它是由两个一维数组组成的
作者: 一休    时间: 2015-6-17 17:10
对   不存在   二维数组只是在一维数组中存放一维数组的地址值
作者: 王骥    时间: 2015-6-17 22:35
只知道有这么一说,终于明白其中的道理了
作者: 洪伟    时间: 2015-6-18 22:28
本帖最后由 黑色柳丁 于 2015-6-19 11:31 编辑
黑色柳丁 发表于 2015-6-17 15:13
当一维数组的元素是非数组类型的时候称为一维数组,当一维数组的元素是一维数组时他就叫做二维数组。二维数 ...

我只是说一下它的原理,怎么理解都可以啊。用到二维数组的时候可以不同考虑这些啊,会用就行。其实在我看来,你说的和我说的是一回事,你可以运行下我在上面写的代码。


作者: GoldMan    时间: 2015-6-18 22:30
分析的很好,加油
作者: 黑色柳丁    时间: 2015-6-19 11:31
洪伟 发表于 2015-6-18 22:28
我只是说一下它的原理,怎么理解都可以啊。用到二维数组的时候可以不同考虑这些啊,会用就行。其实在我看 ...

我只是从学术的角度来将这个问题。既然它已经被定义了.那么在正常情况下,它就是这个东西。如果定义可以轻易被推翻.那么牛顿第一定律也可以被称为牛顿的第N定律。既然学术上已经为它做好了定义,而且人们也习惯了,就不要再去想要推翻它。你的结论不成立。建议你先把二维数组的概念弄清楚。再来说这个话题。就好比固态的水被称为冰,这是因为特殊情况下的特殊现象。难道你可以说其实不存在真正的冰吗。
作者: 洪伟    时间: 2015-6-19 11:50
黑色柳丁 发表于 2015-6-19 11:31
我只是从学术的角度来将这个问题。既然它已经被定义了.那么在正常情况下,它就是这个东西。如果定义可以轻 ...

我没说我有什么结论啊,按你说的,二维数组是数组的数组,是一种特殊的一维数组,这个该怎么解释呢,难道就是宏观的定义一下,怎么特殊,怎么是数组的数组。了解一下它特殊的原理不好吗?水和冰都是h2o,了解一下水升华成水蒸气,放热凝结成冰这也是知识啊。
作者: 黑色柳丁    时间: 2015-6-19 12:16
每个数组都是在堆内存中开辟一块新的空间.
当数组存储的是基本数据类型的时候,数组中存储的是基本数据类型的值.
当数组存储的是引用数据类型的时候,数组中存储的是引用类型的对象在堆内存中的地址值.
当一维数组的元素是一维数组时,其实就是在堆内存中开辟了一块空间A作为外部数组,另外开辟其他N个空间,每个空间都对应一个内部元素,空间N中存储的是其他数组的地址值.
它的特殊性就在于内部元素是数组,同时每个数组的地址值都被外部数组所引用。
如果是一维数组,它的地址值是不会在堆内存中被其他数组引用到的。
这是微观的解释。
作者: 洪伟    时间: 2015-6-19 12:27
黑色柳丁 发表于 2015-6-19 12:16
每个数组都是在堆内存中开辟一块新的空间.
当数组存储的是基本数据类型的时候,数组中存储的是基本数据类型 ...

我都醉了,我就不明白,你说的和我的代码有什么不同吗?
作者: wenxueaaa555    时间: 2015-6-19 13:16
二维数组中就是几个一位数组
作者: zlpiano    时间: 2015-6-19 14:16
楼主的探究精神令人肃然起敬
作者: Happe_Sun    时间: 2015-6-19 20:37
谢谢分享!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2