A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 禾呈 中级黑马   /  2013-7-3 08:48  /  1407 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杜光 于 2013-7-3 12:14 编辑

生成一个二维数组

int[][] a=new int[j];
就相当于与生成了i+1个一维数组,一个长度为i用于存储int[]类型数据的数组,i个长度为j用于存储int类型的数组
那么其在内存中是如何存储的?
我的理解是这样的:
a 是二维数组的引用存储于栈中

a指向的用于存储int[]类型数据的数组存储于堆

a[j]存储的为第j个用于存储int类型的数组的引用,其引用存在于栈中,至于其指向的数组存储于堆中
对吗?

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

4 个回复

倒序浏览
连续的内存空间。

Java中使用new创建数组仅仅只是引用变量被创建,并没有数据实体。int[][] a=new int[5][2];  一个引用的内存占用为4个字节。 每一个引用记录一个int型变量的内存首地址。也就是40个字节,申请这样的数组时,计算机先在堆空间查找一个不小于40个字节的连续内存空间。然后将空间的第一个地址交给 a这个引用保存。因为引用每个4字节,a + 四个字节,就成了第二个数组引用变量。依次向后推,可遍历整个数组。这是计算机底层对数组的操作过程,你没必要了解这么清楚。需要注意的一点就是。
数组中存放的是引用,而不是变量实体。一个int8字节,一个引用4字节a这个变量占用的空间是4字节,他里面保存着一个16进制的地址,这个地址处存放的变量才是直接的int型变量,是占8个字节的。

二维数组和一维数组在使用上没什么特别的不同。在实际中二维数组是完全可以被一维数组代替的,只是为了观察方便才出现的二维数组。如果你使用过一个一维数组来代表一个地图你就明白了。

有一个地图,宽10格,高6格,你的第一反映是一个定义一个二维数组来代表它,其实完全可以定义一个,10*6的一维数组。10是用一个变量W记录,6用一个变量H记录,当你需要使用地图上的第三行,第二格时,可以用该 数组的第W*2+1来索引这个元素。为什么第三次是*2第二格是+1呢,我相信你应该能想明白。

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
1,int[][] a=new int[j];就是生成了 i 个一维数组,而不是i + 1个uiwei数组
2,数组引用变量是存放在栈内存中,数组元素是存放在堆内存中,通过栈内存中的指针指向对应元素的在堆内存中的位置来实现访问
3,a[j]
其引用,数组存储都在堆中
理解一下这张毕老师讲的图片

评分

参与人数 1技术分 +1 收起 理由
杜光 + 1 每天提问并回答问题,是对知识的复习和积累.

查看全部评分

回复 使用道具 举报
本帖最后由 denghui1010 于 2013-7-3 10:12 编辑
  1. //最后一句不对,a[i]是第i+1个存储int型数据的数组的引用
  2. int[][] arr = {{1,2},{3,4},{5,6}};
  3. System.out.println(arr);
  4. //输出的结果是[[I@def577d
  5. int[][] arr = {{1,2},{3,4},{5,6}};
  6. System.out.println(arr[0]);
  7. //输出的结果是[I@def577d       
  8. //你仔细想想呢       
复制代码
回复 使用道具 举报
楼主你好  如果帖子的问题已经解决,请把帖子的类型改为“已解决”。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马