【Java基础】分清堆和栈
程序员文章站
2022-05-06 09:38:20
...
其实关于堆栈的问题在脑海中盘旋了挺久的了。从C语言开始,到数据结构,再到现在的Java,它一直在!现在就让我们从头开始吧。
明确概念
首先应该明确堆和栈是不同的东西,其次数据结构中的堆和栈与编程语言中的堆和栈不是同一个概念。
从数据结构说起
栈:即Stack,是一个LIFO队列。对它的操作有pop(),push(),peek()等。
堆:即Heap,是一棵完全二叉树(heap的某一种),它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。
具体内容可以参考后续关于数据结构的系列博客。
再到C语言
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)
上一篇: 堆栈的实现与应用--工具
下一篇: 堆栈学习笔记
推荐阅读
-
深入了解Java数据结构和算法之堆
-
Java基础 —— Java标识符和关键字
-
JavaEE基础day02 1.定义Java中的变量 四类八种 2.变量定义和使用的注意事项 3.数据类型的转换、强制数据类型转换4.算数运算符、比较运算符、逻辑运算符、赋值运算符、三元运算符
-
【java基础】上传型和下转型对象
-
Java基础讲解--基本数据类型和运算
-
Java基础学习总结(129)——Arrays.asList得到的List进行add和remove等操作出现异常解析
-
浅谈C#中堆和栈的区别(附上图解)
-
Java基础篇_有关接口和抽象类的几道练习题(分享)
-
java基础(System.err和System.out)详解
-
浅谈C#中堆和栈的区别(附上图解)