A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张凯 中级黑马   /  2012-7-6 21:59  /  3136 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张凯 于 2012-7-7 07:39 编辑

看视频,在说内存结构时,讲到了堆栈的存储,我还是不太明白,什么时候需要把数据存放到堆中,什么时候需要把数据存放到栈中,毕老师在举的例子中,当定义一个数组时,把数组的名字放到栈中,而把数组的实体放到堆中,但是在举这个例子时
int a=5;
int b=a;
b=8;
s.o.p(a);毕老师说这个只涉及到栈操作,我不明白,为什么不是栈中只存放a,b两个变量,而在堆中存放其对应的数值5和8,菜鸟一枚,还请大侠多多指点一番。

8 个回复

倒序浏览
首先给你大的观念是:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便.
像上面你说到的定义普通变量时,放到栈里面。而如果新建了一个引用对象如,Integer []num = new Integer[3]
这时栈进而面就存引用,而实际的数据对象放在堆里面。总之,用new创建的对象才会放在堆中。
回复 使用道具 举报
本帖最后由 赵方明 于 2012-7-6 23:50 编辑

这个问题好多人问。。。。先给你看看我做的笔记的内存部分,然后结合代码讲一讲。
9,内存的结构是什么样的?
内存分为5个部分,栈内存,堆内存,方法区,本地方法区,寄存器。
10,栈内存的作用和特点时什么?
栈内存存储局部变量,当数据使用完,所占空间会自动释放。
11,什么是局部变量?什么是成员变量?
定义在方法或者说函数里的变量,方法的参数里的变量,定义在for循环里的变量是局部变量。
定义在类里的变量是局部变量,定义在类里的函数叫做成员函数。
12,堆内存作用是什么?特点是什么?
通过new关键字建立的实体都存放在堆内存中,实体包括数组和对象。
特点:每一个实体都有内存地址值。
实体中的变量都有默认初始化值。
实体不再被使用,会在不确定的时间内被垃圾回收器回收。
Int [] x=new int[3];//这是一个赋值动作,赋的值不是数组,而是数组在内存中的地址。
New在堆内存中开了一个空间存放数组。X中存放的是这个空间的地址值。
13,数组中元素有没有默认值?
有,实体中的变量都有默认初始化值。
Int型默认初始化值是0.
Boolean类型默认初始化值是false。
14,如何让12中的x不再指向右面的数组?
用 x=null; 此时x中存储的将不是右面数组的地址值,而是为空。此时x就不再指向右面的数组。
15,堆内存中的垃圾是怎么回事?
一个堆内存中的实体,当栈内存中没有任何引用指向它时,则视它为垃圾。这个垃圾不会立刻被内存清除掉。而是在一个不确定的时间内由垃圾回收器回收。

首先要知道,栈中存储的是局部变量,包括定义在方法中的变量,定义在方法形参列表的变量,和for循环里的变量。
而堆内存中存储的是实体,包括对象和数组。
class Memory
{
        public static void main(String[] args)
        {
                int a=5;//a是定义在主函数里的变量,所以存储在栈内存中。执行这一句时,在栈内存中开辟一片内存空间,空间名是a,存储int类型变量。并初始化为5.这里不涉及堆内存。
                int [] arr=new arr[] {2,3,5,3,5};//这里,先说在左边。左边实际上定义的是一个变量,变量类型是int [],变量名是arr。所以在栈内存中开辟一片内存空间,空间名是arr,类型是int [].再看new arr[] {2,3,5,3,5},new关键字在堆内存中开辟一片内存空间,这片内存空间是一个数组,存储数组元素。并初始化。堆内存中每个空间都有地址值。new arr[] {2,3,5,3,5}的地址值就赋给了arr。
        }
}

评分

参与人数 2技术分 +2 收起 理由
刘笑 + 1
黑马张扬 + 1 很给力!

查看全部评分

回复 使用道具 举报
发重了
回复 使用道具 举报
首先要明白的是:内存分为四个部分:heap(堆)\stack(栈)\code segment\data segmet\
其中堆中存放的是NEW 出来的对象  而栈中存放的是局部变量  而静态变量和字符串常量放在data segment中  剩下的就是代码了 ,存放在CODE SEGMENT中。
你说的
int a=5;
int b=a;
b=8;
这些都是一些基本数据类型,他们都是放在栈中。
再举一个例子:string b="1";
对于String类型,变量名b和值也都是和基本类型一样在栈中的, 它的执行过程是这样的,在栈中创建一个变量b 然后再栈中寻找是否有"1"这个串  如果有 直接将b的引用指向"1",没有的创建一个"1"值,然后引用。
但是如果把string b="1"; 变成String b = new String("1");的话,这里的"1"就是在堆中的具体一块内存了。因为new出来的对象是存放在堆中的。
不知这样说你明白吗。

评分

参与人数 1技术分 +1 收起 理由
刘笑 + 1

查看全部评分

回复 使用道具 举报
赵方明 发表于 2012-7-6 22:50
这个问题好多人问。。。。先给你看看我做的笔记的内存部分,然后结合代码讲一讲。
9,内存的结构是什么样的 ...

你写的太好了
回复 使用道具 举报

RE: 关于堆栈的问题,有些模糊

周刚 发表于 2012-7-6 22:22
首先给你大的观念是:
栈由系统自动分配,速度较快。但程序员是无法控制的。
堆是由new分配的内存,一般速 ...

原来只有new创建的数组和对象才放到堆中,谢谢了。
回复 使用道具 举报
万宝东 发表于 2012-7-6 22:53
首先要明白的是:内存分为四个部分:heap(堆)\stack(栈)\code segment\data segmet\
其中堆中存放的是N ...

你说的内存分为四部分,怎么跟楼上的不同,楼上是五部分:栈内存,堆内存,方法区,本地方法区,寄存器。哪个对啊。
回复 使用道具 举报
张凯 发表于 2012-7-7 07:35
你说的内存分为四部分,怎么跟楼上的不同,楼上是五部分:栈内存,堆内存,方法区,本地方法区,寄存器。 ...

寄存器我记得跟 堆栈code segment datesegment  不是在一起的 。寄存器是在处理器内部的速度最快的存储区,但是数量极其有限。不过楼上的同学说的那么专业,我也不敢确定了。问问楼上的同学吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马