欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Java基础】分清堆和栈

程序员文章站 2022-05-06 09:38:20
...

其实关于堆栈的问题在脑海中盘旋了挺久的了。从C语言开始,到数据结构,再到现在的Java,它一直在!现在就让我们从头开始吧。

明确概念

首先应该明确堆和栈是不同的东西,其次数据结构中的堆和栈与编程语言中的堆和栈不是同一个概念。

从数据结构说起

栈:即Stack,是一个LIFO队列。对它的操作有pop(),push(),peek()等。

【Java基础】分清堆和栈

堆:即Heap,是一棵完全二叉树(heap的某一种),它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。

具体内容可以参考后续关于数据结构的系列博客。

再到C语言

【Java基础】分清堆和栈

int a = 0; //全局初始化区 
char *p1; //全局未初始化区 
main() 
{ 
    int b; //栈 
    char s[] = "abc"; //栈 
    char *p2; //栈 
    char *p3 = "123456"; //123456\0在常量区,p3在栈上。 
    static int c =0 //全局(静态)初始化区 
    p1 = (char *)malloc(10); //堆 
    p2 = (char *)malloc(20);  //堆 
}

一个比较直观的感受就是使用malloc()函数分配出来的空间在堆上,其它经过系统初始化的在栈上。堆上的不能自己回收,栈上的会随着函数结束后自动回收。

Java中的堆和栈

堆区:存放所有new出来的对象本身

栈区:存放基本类型的变量数据和对象的引用

静态域:存放静态成员(由static定义)

常量池:存放字符串常量和基本类型常量(public static final)


相关标签: 堆栈