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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zuochbd 中级黑马   /  2014-9-28 02:15  /  1512 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 caixingke 于 2014-9-28 02:21 编辑

栈和堆, 一向是一个大话题, 特别是初学者往往搞不懂这两者.IT行业纯粹是老米和老欧开创的, 教科书是他们写的, 名字是他们发明的, 标准是他们定的.
所以, 学计算机, 对概念的理解最好要多从英文的角度来理解.

栈(stack)还好理解, 大家知道它是FILO(first in, last out先进后出).
英文stack中的"st"常常表示一种"站立", 比如"stand""stage""stable"等等.
是一种整齐而有序的东西.
栈就是这种整齐而有序的东西.

但堆(heap)呢? 怎么理解?
以下的理解是我个人的理解.
heap, 即"堆", 垃圾堆的"堆". 垃圾堆成山, 我们去垃圾堆扔垃圾时, 都是随手扔过去的.
我们扔的垃圾停到何处? 这要靠运气! ----即, 我们程序员并不能控制这个对象要分在堆空间中的某个位置.
说得有点恶心了.
堆就是这种不整齐也无序的东西.
实际上, 这个对象要分配到堆空间的哪个位置, 是由操作系统的内存管理机制决定的(在Java里面, 应由java虚拟机由管理的吧).
这种内存管理机制有很多种, 最有名的运用得很广泛的一种是: 伙伴系统.

我想, 这大概就是 为什么要把那块内存命名为"heap"吧.
初学者, 特别是对计算机原理不懂的初学者, 可以这么看内存:
有一块整齐而有序的区域, 这块区域是栈空间. 函数中的局部变量就分在这个栈空间中, 一个函数执行完, 其中的局部变量空间就被撤消掉了.
有一块杂乱如山的区域, 这块区域是堆空间. 对象就是分在这个空间中的. 这个空间的对象具有全局作用域.
无论是java, 还是C/C++, 都是要用到这个栈空间和堆空间的.




评分

参与人数 1技术分 +1 收起 理由
敏敏好学 + 1 赞一个!

查看全部评分

8 个回复

倒序浏览
比喻的好!!! 感谢,,,一直以为堆也是有顺序的 -0 - ...可否能讲讲 内部类和嵌套类和迭代器 在 内存中的表现???特想知道, 百度了也没看出所以然来,,,
类学到内部类和嵌套类 开始纠结了, 按毕老师的话就是"挂了" 囧,,,
回复 使用道具 举报
JAVA中的内存管理是由JVM还完成的,不能手动的,不像C++中的指针那样灵活。C++的好处就是操作灵活,想怎么用就怎么用,不过也有危险的。JAVA的好处就是SUN提供了一些NB的类库,操作没有像C++那样灵活,不能手动,只能由系统来搞定。堆就是放变量的,在编译时就已经确定的,栈就是在动行是向内存中申请的内存空间。明白了不。。。听说过多肽吧。多肽分为编译时多肽和运行时多肽。编译时多肽相当于堆。运行时多肽相当于栈

点评

我没看懂...  发表于 2014-9-28 13:23
这哥们儿有点喜感  发表于 2014-9-28 12:50
回复 使用道具 举报
不系之舟王 来自手机 中级黑马 2014-9-28 09:16:37
板凳
解释的不错
回复 使用道具 举报
朴日男 发表于 2014-9-28 02:50
比喻的好!!! 感谢,,,一直以为堆也是有顺序的 -0 - ...可否能讲讲 内部类和嵌套类和迭代器 在 内存中的表现? ...

我其实有发过一个关于 内部类 的贴子. 无奈没人理. 可能是我写的东西太晦涩了, 看起来比较累吧. 改天我修改下.
回复 使用道具 举报
解释的更加简单独到
回复 使用道具 举报
sk0806 高级黑马 2014-9-29 08:20:58
7#
不错,顶楼主,懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马