黑马程序员技术交流社区

标题: java 堆和栈的问题? [打印本页]

作者: zoudeyong    时间: 2013-5-5 21:34
标题: java 堆和栈的问题?
栈和堆有啥区别?基本数据类型和引用数据类型在栈和堆中是怎样存储的?
作者: hou604720966    时间: 2013-5-5 21:40

顶楼上的
作者: 赵利斌    时间: 2013-5-5 21:41
2楼正解啊
作者: 337091921    时间: 2013-5-5 21:48
栈中主要是方法和局部变量,堆中主要是 对像和成员变量。
作者: 337091921    时间: 2013-5-5 21:49
栈中主要是方法和局部变量,堆中主要是 对像和成员变量。堆为栈提供地址值,所以栈可以指向堆
作者: 施祖喜    时间: 2013-5-5 22:00
栈内存中存储的都是方法,方法在栈中开辟空间储存各种引用的地址值;
堆内存中储存的都是实例(也就是new出来的东西),实例在堆中开辟空间存储实例的属性,
作者: xuluheng718    时间: 2013-5-5 22:04
本帖最后由 xuluheng718 于 2013-5-5 22:07 编辑

不多说,上图


作者: 余威宏    时间: 2013-5-5 22:31
Java把内存划分成两种:一种是栈内存,一种是堆内存。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
堆内存用来存放由new创建的对象和数组。
在堆中分配的内存,由Java虚拟机的自动垃圾回收器来治理。

作者: 潇湘    时间: 2013-5-7 06:18
String s1 = "hello"; String s2 = "world"; String s3 = "hello"; 此时的s1=s3,String s1 = "hello"; 它是在栈中给s1分配一个变量hello,当s3再次分配的时候它会先去从栈中找看有没有hello变量,如果有就直接连接到那个地址,没有就新创建一个,所以此时s1和s3是指向同一个地址,内容相同,记住,他们是存放在栈中。 s1 = new String("hello"); s2 = new String("hello"); 此时s1 != s2,对与new来说,它是在内存中分配空间,new s1是它会给s1分配一个空间存放hello,当new s2时,它会给s2分配另一空间存放hello,它们的地址是不同的,所以不相等,而且还要注意的是 “=”比较的是引用,相等于地址吧,所以二者不等,但是你用equals时它们就是相等的,即s1.equals(s2)返回的是true,因为它比较的是对象值。记住,new是在内存中分配空间。看看这个,把String s1 = "hello"理解成int i= 1, s1 = new String("hello")理解成 i = new Integer(1);
作者: 罗广伟    时间: 2013-5-7 07:49
尹桥印 发表于 2013-5-5 21:37:38
本帖最后由 尹桥印 于 2013-5-5 21:39 编辑

栈是用来装变量和引用类型的,装了变量以后,变量上是有值的,而引用类型本身在里面是没有值的,而是放在堆里面的
堆就是装new出来的东西

字符串是放在什么内存中的?




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