该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

Java 把内存划分成两种:一种是栈内存,另一种是堆内存。

在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,当在一段代码块定义一个变量时,Java 就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java 会自动释放掉为该变量分配的内存空间,该内存空间可以立即被另作它用。

堆内存用来存放由 new 创建的对象和数组,在堆中分配的内存,由 Java 虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或者对象之后,还可以在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象,引用变量就相当于是为数组或者对象起的一个名称。引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。而数组和对象本身在堆中分配,即使程序运行到使用 new 产生数组或者对象的语句所在的代码块之外,数组和对象本身占据的内存不会被释放,数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。

堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:

堆中某个节点的值总是不大于或不小于其父节点的值(最大根大根堆/最小根小根堆)

堆总是一棵完全二叉树。

②堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。

③堆是应用程序在运行的时候请**作系统分配给自己内存,一般是申请/给予的过程。

栈(stack)又名堆栈,线性表。仅允许在表的一端进行插入和删除运算。这一端为栈顶,另一端为栈底,先进后出。

空间分配

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

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

缓存方式

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

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

数据结构

①堆:堆可以被看成是一棵树,如:堆排序。

②栈:一种先进后出的数据结构。

队列

①队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

②队列中没有元素时,称为空队列。

③建立顺序队列结构必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个是队头指针front,它指向队头元素;另一个是队尾指针rear,它指向下一个入队元素的存储位置。

④队列采用的FIFO(first in first out),新元素(等待进入队列的元素)总是被插入到链表的尾部,而读取的时候总是从链表的头部开始读取。每次读取一个元素,释放一个元素。所谓的动态创建,动态释放。因而也不存在溢出等问题。由于链表由结构体间接而成,遍历也方便。(先进先出)

整体区别

①堆是在程序运行时,而不是在程序编译时,申请某个大小的内存空间。即动态分配内存,对其访问和对一般内存的访问没有区别。

②栈就是一个桶,后放进去的先拿出来,它下面本来有的东西要等它出来之后才能出来。(后进先出)

③队列只能在队头做删除操作,在队尾做插入操作.而栈只能在栈顶做插入和删除操作。(先进先出)

④堆是指程序运行时申请的动态内存,而栈只是指一种使用堆的方法(即先进后出)。

1、管理方式不同;

2、空间大小不同;

3、能否产生碎片不同;

4、生长方向不同;

5、分配方式不同;

6、分配效率不同;

java 队列和栈区别是什么_队列和栈有什么区别?相关推荐

  1. java与工控系统关系_三大工业控制系统的本质区别

    随着工业技术的快速发展,相继出现了集散控制系统和现场总线控制系统, 一些行业当中有的人认为FCS 是由PLC发展而来的;另一些行业的人认为FCS又是由DCS发展而来的.FCS与 PLC及DCS之间既有 ...

  2. JAVA线程池_并发队列工作笔记0001---认识阻塞队列_非阻塞队列

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 注意这个ConcurrentLinkedQueue这个是个非阻塞队列, 这个队列是没有长度限制的, ...

  3. java循环队列入队出队算法_循环队列实现

    生活中有很多队列的影子,比如打饭排队,买火车票排队问题等,可以说与时间相关的问题,一般都会涉及到队列问题:从生活中,可以抽象出队列的概念,队列就是一个能够实现"先进先出"的存储结构 ...

  4. java 无锁栈_队列加锁无锁栈实现一例

    本篇文章个人在上海游玩的时候突然想到的...这两天就有想写几篇关于队列加锁的笔记,所以回家到之后就奋笔疾书的写出来发布了 一.何谓无锁队列 无锁队列,望文生义,即不需要加锁的队列:之所以不需要额定加锁 ...

  5. 队列管理器连接数设置_详解!基于Redis解决业务场景中延迟队列的应用实践,你不得不服啊...

    一.业务概述 我们假定设置两个队列,一个队列维护正式工单,另一个队列维护挂起工单.对于挂起操作,我们通过Redis设置key有效时间,当key失效时,客户端监听失效事件,获取工单,实现 挂起工单队列的 ...

  6. websphere mq 查看队列中是否有数据_全网最全的 “消息队列”

    消息队列的使用场景 以下介绍消息队列在实际应用常用的使用场景.异步处理.应用解耦.流量削锋和消息通讯四个场景. 1]异步处理:场景说明:用户注册后,需要发注册邮件和注册短信. 引入消息队列后架构如下: ...

  7. java数据结构 队列_Java数据结构与算法[原创]——队列

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本文介绍数据结构中的队列(queue)的概念.存储结构.队列的特点,文末给出ja ...

  8. 『TensorFlow』第十一弹_队列多线程TFRecod文件_我辈当高歌

    TF数据读取队列机制详解 一.TFR文件多线程队列读写操作 TFRecod文件写入操作 import tensorflow as tf def _int64_feature(value):# valu ...

  9. java环形数组_Java数组模拟环形队列

    1.假溢出 ​系统作为队列用的存储区还没有满,但队列却发生了溢出,我们把这种现象称为"假溢出". 因为队列遵从从队尾存入数据,从队头取数据,所以红框部分的空间就不能继续存入新的数据 ...

最新文章

  1. linux ip add address,linux – ip地址范围参数
  2. hdu4763 KMP
  3. windows桌面待办事项_想在手机桌面上安装一个便利贴,下载什么便签软件好?
  4. 【笔记】opencv的python实现·像素处理 像素访问 alpha通道
  5. 使用Socket模拟聊天室
  6. find linux 指定后缀_Linux终端命令入坑必备知识与技巧
  7. .net npoi xssfclientanchor设置图片缩放大小_.NET导出Excel的四种方法及评测
  8. 超棒的在线Bootstrap主题编辑工具 - lollytin
  9. 在Java中导出word、excel格式文件时JSP页面头的设置
  10. 安理大计算机专业全国排名,安徽大学排名:安徽有哪些大学2017排名
  11. 支持全系列阵列卡的专用服务器PE工具
  12. word中 插入公式及交叉引用
  13. 第五届山东理工大学ACM网络编程擂台赛
  14. html 闪白光效果,css3实现图片划过一束光闪过成效
  15. 高等数学 武忠祥强化班
  16. Unity2d 学习笔记(四)碰撞检测
  17. lan代表计算机什么,LAN 是什么
  18. 21.12.8组合数
  19. JDBC - MySQL
  20. JZOJ 5539 psy

热门文章

  1. 使用Python计算三角形的周长和面积(海伦公式)
  2. 万魔超能豆1MORE Neo 全新上市,时尚四色,双十一学生党必入耳机!
  3. Unity3d官方打飞机demo污化版
  4. 如何访问 android系统hide的类或接口
  5. PowerDesigner导入Excel表
  6. 毕业设计之基于springboot和vue的音乐网站
  7. css英文文本转化属性的是,css文本属性_CSS教程_郭隆邦技术博客
  8. 服务器性能测试,导热膏选择
  9. 小米6刺激战场战斗服务器没有响应,绝地求生刺激战场小米6无限卡顿解决方法分享...
  10. 谷歌浏览github插件