`
syyixin
  • 浏览: 36664 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java基础之栈堆简介

    博客分类:
  • Java
阅读更多

 

(stack)与堆(heap)是两种数据结构,其数据项均按序排列,即只能在一端对数据项进行插入、删除等操作。其中栈一般由编译器自动分配释放,用来存放方法的参数值、局部变量等数据,遵循先进后出(First-In/Last-Out)原则;堆则一般运行时分配,用来存放New出来的对象等数据,由JVM自动回收,遵循先进先出(First-In/First-Out)原则。

 

栈堆均存在缓存机制,其中栈用的是一级缓存,局部变量等被调用时分配内存,调用完毕则空间立即被释放;栈使用的是二级缓A存,其生命周期由Java虚拟机JVM的垃圾回收算法自动回收。很显然,因为缓存机制不同栈中局部变量等数据调用速度会比较快,而堆中对象等数据生命周期不确定且属于运行时动态分配,故调用速度效率相对较低。

 

这里我做一个不太妥当的比喻以帮助大家理解:栈是呼吸系统,进入呼吸系统的主要是空气,空气更新比较快;堆是消化系统,一个馒头一只苹果地进去,经过消化系统较长时间的消化后才被排出,并且早上吃的鸡蛋一定比晚上吃的粥先排出来,如下示意图所示:


 

 

举个具体的例子,我们知道 intbyteshortfloat等基本数据类型定义的时候是以“数据类型变量名 = 变量值;”的方式进行定义,如int x=1;。编译器分析这句话的时候首先在栈中创建一个变量为x的引用,然后在栈中进行查找,看有没有值为1的地址存在;如果存在则将引用指向该地址,否则开辟存放1的地址并将变量x指向该地址,这里假设指向的地址为0x0001。需要注意的是,这些基本数据类型是值类型,传递的是值而非引用。即如果定义一个新的变量y=1;编译器就是寻找值为1,因为之前有x的引用指向的值为1,所以找到了,那么栈中创建变量y的引用并指向x指向的地址,亦即xy两个变量指向同一个地址0x0001。这时候我们改变x的值,比如x=3;,因为栈里面找不到值为3的地址,所以栈开辟新的空间来存这个值,比如这个空间地址是0x0002,这时候x的值确实变化了,但x 的变化并没有影响y的值的变化,y变量的引用指向的仍旧是值为1的地址0x0001。栈的内部处理流程及结构如下图所示:



 

 
 

 

 

Java中通过new()关键字来显式告诉编译器这些new出来的对象要放在堆中,并且是运行时才能动态创建,其内部运行机制和结构与栈类似,栈弄明白了堆自然而然也就变得明了。

 

        

 

作者:忆辛,公历201522日17时09分写于羊城,发表在iteye网站,未经作者书面许可,任何单位或个人不得转载、复制本文的全部或部分内容。

 

  • 大小: 39.3 KB
  • 大小: 32.6 KB
  • 大小: 6.7 KB
4
2
分享到:
评论
4 楼 syyixin 2015-02-03  
谢谢指出,写错了;栈一级堆二级
3 楼 tomgxf 2015-02-03  
栈1级缓存,堆2级缓存。
2 楼 huyinghuying 2015-02-03  
“栈使用的是二级缓存” 是 “堆使用的是二级缓存”
1 楼 huyinghuying 2015-02-03  
"栈使用的是二级缓A存" 应该是“堆栈使用的是二级缓A存”

相关推荐

    java基础知识简介

    本教程主要围绕“Java基础知识简介”展开,包括Java语言概述、课程架构、Java SE结构、常用命令操作、语言特性、JDK配置与环境变量设置以及Java注释和API的使用。 首先,Java语言概述部分会介绍Java的历史背景,它...

    传智播客.黑马程序员《Java 基础入门》课后习题答案

    《Java 基础入门》课后习题答案 第 第 1 章 Java 开发入门 一、填空题 1、 Java EE、Java SE、Java ME 2、 JRE 3、 javac 4、 bin 5、 path、classpath 二、选择题 1、ABCD 2、C 3、D 4、B 5、B 三、简答题 1、 面向...

    Java基础 学习笔记 Markdownr版

    本学习笔记主要涵盖了Java的基础知识,包括面向对象、集合、IO流、多线程、反射与动态代理以及Java 8的新特性等方面,旨在帮助初学者或有经验的开发者巩固和提升Java编程技能。 1. 面向对象(OOP):Java的核心是...

    黑马程序员java基础试题、笔记

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发领域占据主导地位。"黑马程序员java基础试题、笔记"这个压缩包资源为Java初学者和希望加入"黑马程序员"培训课程的学员提供了丰富的学习材料。这些资源包括...

    Java基础课程

    Java基础课程PPT资源;知识点:自定义动画、选择器高级应用、响应式网站开发、行业命名规范、域名注册-搭建个人网站 让学员熟练掌握css、js、JQuery等技术,可做到独立编写PC+移动端网站页面。并且能够独立开发web...

    Java从零基础到精通详细笔记高清完整PDF版

    ### Unix/Linux基础命令 Unix/Linux系统是一个多用户多任务的操作...通过循序渐进的视频教程,学习者可以更好地理解Java编程的基础知识,从而为进一步学习Web开发、数据库交互、框架使用等高级主题打下坚实的基础。

    java基础理论知识串讲java基础理论知识串讲

    java基础理论知识串讲java基础理论知识串讲

    Java基础知识总结 (绝对经典)

    ### Java基础知识总结(绝对经典) #### 一、Java概述 - **起源与发展**:Java语言始于1991年Sun公司的James Gosling等人所开发的Oak语言,原计划用于控制嵌入式设备如有线电视交换盒和个人数字助理(PDA)。1994年...

    java入门基础教程(pdf)

    Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此,Java被广泛接受并...

    java基础思维导图总结

    Java基础总结,融入java基础绝大部分内容,更会在之后的博客中逐渐细化。写一个两年以后还能看懂的博客

    Java基础之多态ppt

    Java基础之多态课程PPT适用于基础学习者使用,很好的课程资源

    传智播客毕向东Java基础全套视频教程》黑马程序员

    《传智播客毕向东Java基础全套视频教程》黑马程序员下载地址.txt ) 完整的视频资源,入门必备.

    Java基础入门教程 含实验文档 实验源码 全部PPT课件 共9个章节 全套文件集合.rar

    Java基础入门教程 第1章 Java 简介(共31页).ppt Java基础入门教程 第2章 java语言基础(共52页).ppt Java基础入门教程 第3章 类和对象(共40页).ppt Java基础入门教程 第4章 继承和多态(共36页).ppt Java基础...

    java基础知识

    java基础知识,java基础知识,java基础知识,java基础知识,java基础知识,

    第2讲 java语言基础知识

    第2讲 java语言基础知识第2讲 java语言基础知识第2讲 java语言基础知识第2讲 java语言基础知识第2讲 java语言基础知识第2讲 java语言基础知识第2讲 java语言基础知识第2讲 java语言基础知识第2讲 java语言基础知识第...

    java基础教程

    《Java基础教程(第3版)》以通俗易懂的语言,循序渐进地向读者介绍了Java语言编程的基础知识。针对较难理解的问题,所列举的例子都是由简到繁,便于读者掌握Java编程技巧。在第3版中加大了面向对象的知识容量,补充...

    全网最全Java基础视频教程

    01.15_Java语言基础(Java开发工具介绍和JDK简介) 01.16_Java语言基础(第一个HelloWorld案例的编写和运行) 01.17_Java语言基础(开发中常见问题小结) 01.18_Java语言基础(为什么要配置path环境变量) 01.19_Java语言...

    java八股文,Java基础知识面试题,md文档

    java八股文,Java基础知识面试题,md文档

    java简介及基础教程及特点阐述.txt

    javajava简介及基础教程及特点阐述.txtjava简介及基础教程及特点阐述.txtjava简介及基础教程及特点阐述.txtjava简介及基础教程及特点阐述.txtjava简介及基础教程及特点阐述.txtjava简介及基础教程及特点阐述.txtjava...

Global site tag (gtag.js) - Google Analytics