堆、栈和堆栈的区别
堆(heap):堆是一种经过排序的树形数据结构,每个结点都有一个值。
栈(stack):它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。(PS:颇有砌墙的砖——后来者居上的赶脚。)
1,申请方式
heap:程序员自己申请,并指明大小。
stack:由系统分配。
2,申请效率
原为:
heap:效率较高,速度较快,但程序员无法对其进行控制。
stack:由new分配的内存,相对效率和速度都较低,且容易产生碎片,但由于是程序员自己申请操作,灵活性强,使用方便。
3,存储的数据类型
stack:存储值类型,即存储固定长度的数据。比如:整数、字符、结构、布尔、枚举等。每个程序在执行时都有自己的堆栈,其他程序不能访问该堆栈。
heap:存储引用类型
三、相关名词
1,压栈(进栈、入栈):用push表示,就是把数据放入栈中,从栈顶放入,有先进后出的特点!
2,清栈:清空栈中所有的数据。
3,出栈:用POP表示,它是和压栈相反的概念,即把数据从栈中取出来。出栈时从栈顶取出。
形象化解释:有二层楼,拿着砖头,继续往上盖楼,就是压栈。取下砖头拆楼,硬生生把楼房给弄成平房,就是出栈。然后,要是看这座楼不顺眼,直接给炸了,灰都不剩那种,就叫清栈。
注意问题:压栈:需要考虑是否满栈,比如一座楼根据地基的承受能力,目前高度达到了极限,那么,就不能往上继续盖。
清栈:需要考虑栈是否为空,空栈,不需要清栈。
出栈:每次出栈都只能出顶栈。(PS:我在想出栈是不是得留下点东西,要是什么都不留,岂不成了清栈了)
4,堆栈溢出:就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了旧的堆栈数据。 (PS:有点像数组的下标越界问题)
。比如:类、接口、数组等。