`
syyixin
  • 浏览: 36947 次
  • 性别: 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基础 学习笔记 Markdownr版

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

    Java 基础入门(传智播客出品).pdf

    Java 基础入门,适合初学入门java的同学

    java 基础异常 java 基础异常java 基础异常java 基础异常

    java 基础异常 java 基础异常java 基础异常java 基础异常java 基础异常 java 基础异常java 基础异常java 基础异常java 基础异常 java 基础异常java 基础异常java 基础异常java 基础异常 java 基础异常java 基础异常...

    java基础案例教程

    java基础的案例分析和实例教学,适合新手及回顾查阅,对于夯实基础有好处

    JAVA基础自学教程

    写的很详细,适合初学者,里面的讲解很丰富,很有学习价值,最好是配套一本详细的JAVA基础一起看,会有更好的效果

    java简介及基础教程和实用案例分析及特点阐述

    javajava简介及基础教程和实用案例分析及特点阐述java简介及基础教程和实用案例分析及特点阐述java简介及基础教程和实用案例分析及特点阐述java简介及基础教程和实用案例分析及特点阐述java简介及基础教程和实用案例...

    Java基础教程完整版

    Java基础教程完整版 Java基础教程完整版是JAVE_LOVER作者提供的一系列Java教程,总共包含18个章节,涵盖了JavaSE基本...Java基础教程完整版涵盖了JavaSE基本知识点、UML建模、单元测试等内容,是Java学习的不二之选。

    韩顺平_循序渐进学Java零基础【完整笔记】1

    【标题】:“韩顺平_循序渐进学Java零基础【完整笔记】1” 【描述】:这个课程是为初学者设计的,旨在通过系统的学习帮助学生掌握Java编程的基础。课程分为三个阶段,详细讲解了Java语言的核心概念、就业前景以及在...

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

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

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

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

    Java基础知识ppt(适合自学)(中文)

    1. **Java简介**:介绍Java的发展历程、应用领域以及为什么选择学习Java。可能会提及Java的“一次编写,到处运行”(Write Once, Run Anywhere, WORA)特性。 2. **环境搭建**:如何安装Java Development Kit (JDK)...

    Java基础教程教学ppt

    Java基础教程 教学ppt. 苏州职业大学计算机与电子工程系曾海 <br>内容如下: <br>Java基础教程第十三单元《文件处理》ppt及习题 Java基础教程第十二单元《意外处理》ppt+习题+作业 Java基础教程第...

    JAVA基础笔记个人整理的很详细,绝对全面

    1. **Java简介**:Java的起源、特点和应用领域,以及为什么它在软件开发中占据重要地位。 2. **环境配置**:如何安装Java Development Kit (JDK),设置环境变量,以及使用Java编译器javac和运行时环境java。 3. **...

    java基础思维导图总结

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

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

    Java十大基础笔记整理(PDF)

    Java是世界上最流行的编程语言之一,尤其在企业级应用开发中占据主导地位。这份"Java十大基础笔记整理(PDF)"提供了全面的Java基础知识概览,适合初学者进行学习和复习。下面,我们将深入探讨Java的基础知识,涵盖...

    全网最全Java基础视频教程

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

Global site tag (gtag.js) - Google Analytics