返回信息流定义ia只含有两行三列,数组赋值时不是越界了么?怎么还能正常运行并正确输出呢??不解啊啊啊
这是一条镜像帖。来源:北邮人论坛 / java / #25899同步于 2013/6/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
数组明明越界了,怎么还正常运行呢?
Mulany
2013/6/9镜像同步24 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
这样写是对的,二维数组并不要求每一维一样长,我的理解是每一个维度都是一个对象
重新new了一个数组,这样就新分配了空间,并且让ia[0]指向了它
如果直接写ia[0][3] = 4,这样是会越界的,因为还没分配空间
如果用打印或者打断点的方式去查看ia[0],你会发现赋值前后的标识不同,不是同一个对象,也能比较清楚地看出来二维数据的结构,不是想象中的那种方方正正的矩阵
唔,我觉得可以这样理解:
new int[2][3]限定了必须有2行,并且初始化了每一个维度为3个int数据,取值全部为0,但是并未限定每个维度长度一定是3
new int[] {1,2,3,4}重新分配了4个int长度的数组空间,生成了一个新对象和赋值
并且在赋值时将ia[0]引用指向了这个新对象
说白了二维数组它就这样……
唔,酱紫呀 哈哈
【 在 GacktCamui 的大作中提到: 】
: 唔,我觉得可以这样理解:
: new int[2][3]限定了必须有2行,并且初始化了每一个维度为3个int数据,取值全部为0,但是并未限定每个维度长度一定是3
: new int[] {1,2,3,4}重新分配了4个int长度的数组空间,生成了一个新对象和赋值
: ...................
【 在 Mulany 的大作中提到: 】
: [upload=1][/upload]
: 定义ia只含有两行三列,数组赋值时不是越界了么?怎么还能正常运行并正确输出呢??不解啊啊啊
Java的数组本质上可以说是一维的,其实你ia= new int[2][];就足够了
new int[2][3],只是说告诉别人你这个数组是二行三列的,其实第二维只是一个int[],它完全可以是变长的,比如
ia= new int[2][];
ia[0]= new int[10];
ia[1] = new int[20];
%1=new int[]{1,2,3,4}本身就开辟了长度为4的新的空间,
然后a[0]=%1就把a[0]的内容指向了这个新的空间,
原来a[0]所指向的长度为3的空间大概是交给JVM处理了。。。所以没有越界啊
这是我的理解
soga
【 在 qazwsxedc 的大作中提到: 】
:
: Java的数组本质上可以说是一维的,其实你ia= new int[2][];就足够了
: new int[2][3],只是说告诉别人你这个数组是二行三列的,其实第二维只是一个int[],它完全可以是变长的,比如
: ...................
明白了
【 在 q397273499 的大作中提到: 】
: %1=new int[]{1,2,3,4}本身就开辟了长度为4的新的空间,
: 然后a[0]=%1就把a[0]的内容指向了这个新的空间,
: 原来a[0]所指向的长度为3的空间大概是交给JVM处理了。。。所以没有越界啊
: ...................
这个类似于2维指针,你的第三行把a[0]存的原来的指针替换掉了,所以原来的堆空间失去了引用,会被回收,你新申请的{1,2,3,4}会返回一个值到栈空间的特殊变量(java的指针),a[0]接受这个值,指向堆空间。