码迷,mamicode.com
首页 > 其他好文 > 详细

堆和栈

时间:2015-08-31 00:55:12      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

                                                                                                              堆和栈

                                   这里说的是在内存中的堆和栈

 

       堆:自己分配空间的大小,更灵活但因为在堆上存的是值(引用类型的值)但还需要在栈上存地址,并且堆会寻找第一个空间大于所申请空间的地址,然后将该地址从空闲结点链表中删除,并将该地址的空间分配给程序,大小并不一定一致,所以会移除多余的部分,形成新的空间。所以较慢。(reference 后 的理解)

       栈:系统分配空间,空间的大小系统设置好了(大约1~2mb),存的是值类型的值。不是自己设置的,只要栈的剩余空间大于所申请空间,系统将为程序提供内存。没有分配空间后的其他操作,所以比堆快。

 

   堆和栈在变量声明时的对比:

 栈:

  int num;    //在栈上开辟空间存储值(值类型)

 int[]  nums=new int[] /因为new 了,所以在堆上开辟空间存储具体的值,而在栈上会存一个内存地址指向存值的堆上的空间

 

 技术分享

堆和栈的比喻(我自己的理解不是很好,这个是网上的比喻)

堆和栈的区别可以引用一位前辈的比喻来看出: 
    使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 
    使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。比喻很形象,说的很通俗易懂,不知道你是否有点收获。

 

自己的理解:

栈是系统分配空间的,主要存值类型和引用类型的地址,如int 分配空间是的大小是固定的如果是int类型那空间的大小应该是Int类型的最大值,其他基本类型相同,系统设置是给的空间较小;

堆是自己定义变量时设置的大小,存引用类型的值。系统原本就有n个空的空间,当你定义一个引用变量时,会找一个大小相似但可能并不完全一致的空间把地址给栈上存储,而那块空间存具体的值,还会把多出的部分移除,形成新的空间。

 

 

 

 

                                                                                                  封箱和拆箱

 

 (reference 网上)

C#中,封箱特指把struct定义的“值型”转换成class 定义的“引用型”,
int i=5; object o=i; //自动封箱
拆箱把引用型变成值型
int i=(int) o;//C#无自动拆箱,手工拆

Java中封箱特指把变成“基础型”变成“类型”
Integer i=5;//自动把int变成Integer,Java 5版之后的自动拆封箱功能
拆箱指“类型”变“基础型”
int i=new Integer(5);

关于ToString的装箱问题:
例(C#中)
int i=0; //int类型变量

i.ToString //未装箱

原因:int 属于System中
System.ValueType,由该类的方法(ToString)进行转换,使的是方法,没转换
个人理解:1.每个类型都有ToString方法,那是他本身的方法,直接成字符串,不是转换成object

2.装换操作一个变量,那些方法应该是生成新的字符串不是在原来的变量上操作。






 

堆和栈

标签:

原文地址:http://www.cnblogs.com/xiangtianxiayu/p/4772045.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!