原始类型数组存放在堆还是栈
我们知道java 里用new 生成对象和数组存放在堆里。如果我的数组这么定义: int [] arr={1,2,3,4}。
这个数组(1,2,3,4实际值)是存放在堆里还是栈里的呢?
求大侠回答。 --------------------编程问答-------------------- mark下, 我也来了解下 --------------------编程问答-------------------- 不知道,帮你up.
我觉得应该是在栈里吧。毕竟是int 不是Integer,也没有new --------------------编程问答-------------------- 肯定是在堆里,数组初始化时候是new的,感觉上像是组合类型,java的数组大小可以使用变量,那样的话编译时候大小不定,所以肯定要在运行时候在堆里创造。
--------------------编程问答-------------------- 堆里,数组也是对象 --------------------编程问答-------------------- 数据是放在堆里的。 --------------------编程问答-------------------- 堆啊!去看看 JAVA虚拟机原理吧!虽然这本书薄有易做图贵,不是真的是很耐看。。。 --------------------编程问答-------------------- 数组放在栈里,堆里只是记录栈里数组下标为0的内存地址(即数组首地址)。老师这么讲的,具体我也没理解透彻。 --------------------编程问答-------------------- 额,学习下 --------------------编程问答-------------------- 看了上面知道了,在堆里。。。 --------------------编程问答-------------------- 数组是对象 在堆里
基础数据类型直接在栈空间stack分配 --------------------编程问答-------------------- 这个还真不清楚,mark --------------------编程问答--------------------
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上面有下 --------------------编程问答-------------------- 我很冒昧问一句啊
放在栈里又怎么样 放在堆里又怎么样了呢? 个人觉得哇 其实都一样 --------------------编程问答--------------------
放在堆里,另外建议你搜一下网易的公开课里关于计算机的课程 --------------------编程问答--------------------
哈哈。谢谢。 --------------------编程问答--------------------
你老师讲反了,或者你记反了。或者他讲的不是java。
--------------------编程问答-------------------- 堆里面,《Thinking in java》中就有提到 楼主可以看看 --------------------编程问答-------------------- 在堆中
-- java程序运行期创建的类对象和数组对象放在堆中 -- 深入jvm书中是这么说的 ,刚看到 ,蛮不错的书 --------------------编程问答-------------------- 数组不是primitive类型的 --------------------编程问答--------------------
我刚看了一下,公开课里讲了内存分配,但讲的是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 。 --------------------编程问答--------------------
数组是对象, 所以在堆里,
另外, 你这里说的这个,
如果随便哪个是 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数组就是她的对象,那些元素被封装进去了成为对象属性的一部分了,我是这么觉得的 --------------------编程问答-------------------- 学习了。谢谢楼上各位 --------------------编程问答--------------------
说反了 --------------------编程问答-------------------- 数组的引用存放在栈里,数组里面的值放在堆里。栈是程序运行逻辑的存储结构,只有一些基本类型常量和对象的引用才会在栈里,而堆是程序的“仓库”,对象的实体(数组其实也是一个对象,数组名是对象的引用)存放在里面。如果想理解的更深刻,请参考《深入理解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