堆,栈,堆栈

来源:互联网 发布:淘宝商城女装秋装睡衣 编辑:程序博客网 时间:2024/05/22 00:28

下面主要从数据结构书中所说的堆,栈,树以及计算机操作系统中的栈,堆说。

一、数据结构中的堆,栈

数据结构中的堆,栈,树,是一个概念,是逻辑存在的,也就只是一个名字,不是物理存在的。

1、堆(heap)

堆有大根堆和小根堆,堆是一种特殊的树,它每个结点都有一个值,堆的特点是根结点的值最小(或最大),且根结点的两个子树也

是一个堆。就类似一堆东西一样,按照由大到小(或由小到大)“堆”起来。

大根堆:根结点的键值是所有堆结点键值中最大者,且每个结点的值都比其孩子的值大。

小根堆:根结点的键值是所有堆结点键值中最小者,且每个结点的值都比其孩子的值小。


2、栈(stack)

栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照后进先出的原则存储数据,先进入的数据被压

入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的

插入与删除操作中,不需要改变栈底指针。

二、内存管理中堆(heap),栈(stack)

1.堆栈空间分配


栈:由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。


堆: 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。


2.堆栈缓存方式


栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。

堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。


三、JAVA中的堆(heap)、栈(stack)

JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)

堆区:
1.存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)

2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身

3.由 Java 虚拟机的自动垃圾回收器来管理

栈区:
1.每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中

2.每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。

3.栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

方法区:
1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。

2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。

原创粉丝点击