堆和栈
堆和栈
这里说的是在内存中的堆和栈
堆:自己分配空间的大小,更灵活但因为在堆上存的是值(引用类型的值)但还需要在栈上存地址,并且堆会寻找第一个空间大于所申请空间的地址,然后将该地址从空闲结点链表中删除,并将该地址的空间分配给程序,大小并不一定一致,所以会移除多余的部分,形成新的空间。所以较慢。(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.装换操作一个变量,那些方法应该是生成新的字符串不是在原来的变量上操作。