当前位置: 首页 > article >正文

数据结构与算法:堆和栈的区别概述

1.堆和栈的区别

可以具体分为以下两个方面:

  • 一种数据结构;
  • 一种在程序运行时用于存放的地方;

2.数据结构的栈和堆

  • 栈是一种具有后进先出性质的线性表的数据结构,也就是说后存放的先取,先存放的后取。这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。
  • 堆就是用数组实现的二叉树,所有它没有使用父指针或者子指针。堆根据“堆属性”来排序,“堆属性”决定了树中节点的位置。

3.内存中的堆栈

  • 栈中分配局部变量、临时变量的内存空间,内存中的栈区处于相对较高的地址以地址的增长方向为上,栈的内存相对较少,所以开辟太多的,可能会导致栈溢出(例如使用递归的时候,递归层数太深或是没有递归终止的条件都可能导致栈溢出)。
  • 堆区是向上增长的用于分配程序员申请的内存空间,如malloc和new出来的空间都是放在堆区,这些堆区的变量的特点就是手动开辟和手动释放,没能及时释放可能会导致内存泄漏的问题。

4. java中堆和栈的区别:

  • Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的栈空间给线程,主要存放线程执行过程中的局部变量,方法的返回值,基本类型的变量(,int, short, long, byte, float, double, boolean, char)以及方法调用的上下文。栈空间随着线程的终止而释放,栈的优势是,存取速度比堆要快,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈有一个很重要的特殊性,就是存在栈中的数据可以共享。
  • Java中堆是由所有的线程共享的一块内存区域,堆用来保存各种JAVA对象,比如数组,线程对象等,java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等 指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时 动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
  • 1.栈内存存储的是局部变量而堆内存存储的是实体;
  • 2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
  • 3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

http://www.kler.cn/a/4579.html

相关文章:

  • Springboot 注解缓存使用教程
  • 【STM32】HAL库USB实现软件升级DFU的功能操作及配置
  • kotlin的dagger hilt依赖注入
  • Android string.xml中特殊字符转义
  • Qi认证怎么办理?
  • ssh2详细使用步骤,以及常用方法介绍
  • Vue+springboot 高校图书馆座位预约选座系统java毕业设计项目推荐
  • 阿里云-云存储OSS
  • celery详解
  • Leetcode.1574 删除最短的子数组使剩余数组有序
  • macOS 13.3 正式版(22E252)黑苹果恢复版镜像
  • 【算法题】2333. 最小差值平方和
  • 【Paper】2016_基于LQR的多智能体系统协同最优控制_姚蒙
  • c语言基础知识——字符串和内存函数(上)
  • JavaScript Math、Number 对象
  • 陪了我‘十几年‘的电脑,有必要升级到固态硬盘吗?
  • 01.关键字、基本函数、预处理
  • langchain学习4
  • hexo 搭建个人博客记录
  • 理解浏览器的进程与线程
  • AWVS详细教程
  • Linux cmp 命令
  • java的泛型擦除啷个回事罗
  • JDK1.8下多线程使用JDBC加载ClickHouse和hive驱动问题
  • 点击器自动点击器,让你的屏幕操作变得更加简单
  • Python @函数装饰器及用法