当前位置:编程学习 > JAVA >>

原始类型数组存放在堆还是栈

我们知道java 里用new 生成对象和数组存放在堆里。
如果我的数组这么定义: int [] arr={1,2,3,4}。
这个数组(1,2,3,4实际值)是存放在堆里还是栈里的呢?
求大侠回答。 --------------------编程问答-------------------- mark下, 我也来了解下 --------------------编程问答-------------------- 不知道,帮你up.

我觉得应该是在栈里吧。毕竟是int 不是Integer,也没有new --------------------编程问答-------------------- 肯定是在堆里,数组初始化时候是new的,感觉上像是组合类型,java的数组大小可以使用变量,那样的话编译时候大小不定,所以肯定要在运行时候在堆里创造。
--------------------编程问答-------------------- 堆里,数组也是对象 --------------------编程问答-------------------- 数据是放在堆里的。 --------------------编程问答-------------------- 堆啊!去看看  JAVA虚拟机原理吧!虽然这本书薄有TMD贵,不是真的是很耐看。。。 --------------------编程问答-------------------- 数组放在栈里,堆里只是记录栈里数组下标为0的内存地址(即数组首地址)。老师这么讲的,具体我也没理解透彻。 --------------------编程问答-------------------- 额,学习下 --------------------编程问答-------------------- 看了上面知道了,在堆里。。。 --------------------编程问答-------------------- 数组是对象 在堆里 
基础数据类型直接在栈空间stack分配 --------------------编程问答-------------------- 这个还真不清楚,mark --------------------编程问答--------------------
引用 3 楼 tingdedongni 的回复:
肯定是在堆里,数组初始化时候是new的,感觉上像是组合类型,java的数组大小可以使用变量,那样的话编译时候大小不定,所以肯定要在运行时候在堆里创造。

int [] arr={1,2,3,4} 这个没有new呀。 定义时就初始化了。"java的数组大小可以使用变量"是下面这个有意思吧:
int n=10;
int []arr=new [n];(这个在c++ 是通不过的)。 --------------------编程问答-------------------- 数组是对象 在堆里  
基础数据类型直接在栈空间stack分配!!!! --------------------编程问答-------------------- 是在堆里,这个要想理解的透的话,建议看斯坦福大学开放课程:编程方法.14.Open.Stanford.Course:Programming.Methodology.Chi_Eng.640X480-YYeTs人人影视制作.rmvb 这个是关于java内存分配方面的视频,个人觉得讲的比较好,在verycd上面有下 --------------------编程问答-------------------- 我很冒昧问一句啊 

放在栈里又怎么样  放在堆里又怎么样了呢? 个人觉得哇 其实都一样 --------------------编程问答--------------------
引用 14 楼 lwl504 的回复:
是在堆里,这个要想理解的透的话,建议看斯坦福大学开放课程:编程方法.14.Open.Stanford.Course:Programming.Methodology.Chi_Eng.640X480-YYeTs人人影视制作.rmvb 这个是关于java内存分配方面的视频,个人觉得讲的比较好,在verycd上面有下

放在堆里,另外建议你搜一下网易的公开课里关于计算机的课程 --------------------编程问答--------------------
引用 14 楼 lwl504 的回复:
是在堆里,这个要想理解的透的话,建议看斯坦福大学开放课程:编程方法.14.Open.Stanford.Course:Programming.Methodology.Chi_Eng.640X480-YYeTs人人影视制作.rmvb 这个是关于java内存分配方面的视频,个人觉得讲的比较好,在verycd上面有下

哈哈。谢谢。 --------------------编程问答--------------------
引用 7 楼 qgvtcel 的回复:
数组放在栈里,堆里只是记录栈里数组下标为0的内存地址(即数组首地址)。老师这么讲的,具体我也没理解透彻。

你老师讲反了,或者你记反了。或者他讲的不是java。
--------------------编程问答-------------------- 堆里面,《Thinking in java》中就有提到 楼主可以看看 --------------------编程问答-------------------- 在堆中 

--  java程序运行期创建的类对象和数组对象放在堆中  -- 深入jvm书中是这么说的 ,刚看到 ,蛮不错的书 --------------------编程问答-------------------- 数组不是primitive类型的 --------------------编程问答--------------------
引用 16 楼 mengxiangyue 的回复:
引用 14 楼 lwl504 的回复:
是在堆里,这个要想理解的透的话,建议看斯坦福大学开放课程:编程方法.14.Open.Stanford.Course:Programming.Methodology.Chi_Eng.640X480-YYeTs人人影视制作.rmvb 这个是关于java内存分配方面的视频,个人觉得讲的比较好,在verycd上面有下

放在堆里,另外建议你搜一下网易的公开课……

我刚看了一下,公开课里讲了内存分配,但讲的是new Obj 和用new 生成的数组,我的问题是int [] arr={1,2,3,4}。定义时就初始化开辟空间。
并且我发觉Stanford里那个老师有一点讲错了。
String sc="Hello world";    
String sd="Hello world";  
System.out.println(sc==sd);  // true   
这个打印是true。
而那个老师说是false,我刚才还怀疑自己错了,后来用程序测验了一遍的确是true。
sc ,sd 都指向的是堆中同一拘留字符串。
可以参考http://blog.csdn.net/clam_clam/article/details/6831345 。 --------------------编程问答--------------------
引用 22 楼 clam_clam 的回复:
引用 16 楼 mengxiangyue 的回复:

引用 14 楼 lwl504 的回复:
是在堆里,这个要想理解的透的话,建议看斯坦福大学开放课程:编程方法.14.Open.Stanford.Course:Programming.Methodology.Chi_Eng.640X480-YYeTs人人影视制作.rmvb 这个是关于java内存分配方面的视频,个人觉得讲的比较好,在veryc……



数组是对象, 所以在堆里,

另外, 你这里说的这个, 
如果随便哪个是 NEW 出来的, 或者都是 NEW 出来, 肯定不一样
String sc="Hello world";    
String sd="Hello world"; 
第一句执行时, 先去字符串常量里找, (我忘了是啥了, 这里)
看有没这个, 如果有, 就不再创建这个对象, 如果没有, 就创建一个出来,
第二句也是一样的, 所以, 第二句执行时, 肯定已经有了, 所以返回的是同一个对象 --------------------编程问答-------------------- 堆里面,数组也是对象 --------------------编程问答-------------------- 搞了好久:
C/C++中的数组是可以在栈空间中分配,但是Java中数组变量属于引用类型,数组对象在堆中分配。
http://xiongjiesz.iteye.com/blog/980933 这篇博客说的。不知说得正不正确。
另外深入java 虚拟机通过字节码细分析:
newarray  anewarray  multianewarray 。
如 newarray atype (从栈中弹出数组长度,使用atype 指定的基本数据类型分配新数组,将新数组的对象引用压入栈) 
--------------------编程问答-------------------- 搞清楚了,可以看看http://blog.csdn.net/clam_clam/article/details/6833825 页面就知道了。这我总结的。谢谢大家了。 --------------------编程问答-------------------- 噢,学习了。

--------------------编程问答-------------------- 是存放在堆里,数组是类嘛,一个int数组就是她的对象,那些元素被封装进去了成为对象属性的一部分了,我是这么觉得的 --------------------编程问答-------------------- 学习了。谢谢楼上各位 --------------------编程问答--------------------
引用 7 楼 qgvtcel 的回复:
数组放在栈里,堆里只是记录栈里数组下标为0的内存地址(即数组首地址)。老师这么讲的,具体我也没理解透彻。

说反了 --------------------编程问答-------------------- 数组的引用存放在栈里,数组里面的值放在堆里。栈是程序运行逻辑的存储结构,只有一些基本类型常量和对象的引用才会在栈里,而堆是程序的“仓库”,对象的实体(数组其实也是一个对象,数组名是对象的引用)存放在里面。如果想理解的更深刻,请参考《深入理解JAVA虚拟机》。 --------------------编程问答-------------------- 数组的引用存放在栈里,数组里的内容存放在堆里!

这是JAVA的,它跟C不同,C的是:
malloc或new的数组存在堆中
不带static前缀的局部数组在栈中
带static前缀的局部数组和全局数组在全局数据区中  --------------------编程问答--------------------

int[] a = new int[1024*1024*100]; 堆内存400M;
Integer[] b = new Integer[1024*1024*100]; 堆内存400M;
boolean[] c = new boolean[1024*1024*100]; 堆内存100M;

你可以打开jConsole查看内存占用情况就清楚了, 可以看到对象引用跟int一样占用4个字节 --------------------编程问答-------------------- int[] a={1,2,3,4};这个叫做数组的初始化
数组是引用数据类型,所以它的数值存放在堆内存中,
a这个变量就是存放在栈当中,它的值是一个地址值:这个地址值就是开辟堆内存的首地址。
--------------------编程问答-------------------- 纯粹学习下,改天去看下"JAVA虚拟机原理"这本书 --------------------编程问答-------------------- 学习了 --------------------编程问答-------------------- 多维数组可以看成一维数组,比如int[5][3],是一维数组Object[5],保存5个引用,各自指向你创建的int[],这些都是在堆里,堆只是java为内存做的逻辑划分,可以把内存当成一个byte数组
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,