黑马程序员技术交流社区

标题: 数组静态初始化的区别。 [打印本页]

作者: gulup    时间: 2013-8-25 20:34
标题: 数组静态初始化的区别。
本帖最后由 gulup 于 2013-8-28 00:17 编辑

刚刚在j8看到有人问这个问题,我也拿来这里问一下。
int [][] num = {1,2,3};
int [][] num = new int[][]{1,2,3};
这两个有区别吗?我回答是没区别,因为数组是引用数据类型的。实际内容都是在堆内存分配的,上面两个最后都传递引用给了num,指向了堆内存的空间,这有区别吗?没有吧?
如果有区别。求指出区别。谢谢。
作者: sam9204    时间: 2013-8-25 20:51
int [][] num = {1,2,3};直接放在栈内存
int [][] num = new int[][]{};new出来的是放在堆区的,num在栈内存的,两者通过引用连接
作者: 小冰块    时间: 2013-8-25 21:01
的确没区别,数组里的元素无论怎么定义都是放在堆中,引用放在栈里。两者是一样的。
作者: gulup    时间: 2013-8-25 21:02
sam9204 发表于 2013-8-25 20:51
int [][] num = {1,2,3};直接放在栈内存
int [][] num = new int[][]{};new出来的是放在堆区的,num在栈内 ...

我不认同这种看法,第一种初始化方式怎么可能放在栈内存中呢?栈内存中存放的是引用数据类型的引用,这个引用的内存真实数据是存放到堆空间的。数组是引用数据类型,怎么可能把真实数据存放到栈内存?我认为第一种只是第二种的一种简化方式。就跟"abc"就是一个匿名的String对象一样。它一样也是在堆内存的,不可能在栈内存。
作者: 尚前琛    时间: 2013-8-25 21:54
sam9204 发表于 2013-8-25 20:51
int [][] num = {1,2,3};直接放在栈内存
int [][] num = new int[][]{};new出来的是放在堆区的,num在栈内 ...

我不认同这种看法,第一种初始化方式怎么可能放在栈内存中呢?栈内存中存放的是引用数据类型的引用,这个引用的内存真实数据是存放到堆空间的。数组是引用数据类型,怎么可能把真实数据存放到栈内存?我认为第一种只是第二种的一种简化方式。就跟"abc"就是一个匿名的String对象一样。它一样也是在堆内存的,不可能在栈内存。
作者: sam9204    时间: 2013-8-26 10:06
尚前琛 发表于 2013-8-25 21:54
sam9204 发表于 2013-8-25 20:51
int [][] num = {1,2,3};直接放在栈内存
int [][] num = new int[][]{};ne ...

嗯 ,这个可能是我记得有点糊涂了,前者是后者的简化形式没错,照这样推理两者在内存中应该没什么区别。

作者: 王广亚    时间: 2013-8-27 00:49
这两种创建数组的方法除了一个比另一个的简单没有任何存放的的区别,如果你仔细的话可能就会在毕老师的视频中听到。
作者: 黑马-文鸿利    时间: 2013-8-27 07:26
静态初始化和动态初始化开始都指定了数组大小,java也在栈空间分配了相应的大小,只是静态初始化开始就指定了值,而动态初始化是在后面指定数组的值,刚开始数组的值都是默认值
用javap反编译一下生成的class文件就发现是完全一样的
作者: 杨增坤    时间: 2013-8-27 18:03
楼主,如果问题解决了,请把问题的"未解决"更改为"已解决"!
谢谢合作!

更改方法:http://bbs.itheima.com/thread-71308-1-1.html




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