前言:java中常常听到堆栈,但是好多时候感觉还是一个模糊的认识。因此,一定要认真的看下这方面的东西,查阅资料。并作出总结。
堆与栈
- 基本认识
基本认识
首先呢,提出问题:内存中的堆栈和数据结构中的堆栈是否是一样的?
不必过于深刻的去探究的话,也会想到,当然是不同的概念啦!内存中的堆栈是实际存在的存储空间,数据结构中的堆栈只是抽象出来的数据存储结构。 具体的话,首先,内存中所谓的堆栈其实是属于其中的一个划分,叫做动态存储区。动态存储区的话,就分为栈区和堆区。除了动态存储区的话,内存还可以分为代码区和静态数据区。代码区简单的说,肯定是用来存放二进制代码啦!而静态数据区肯定是用来存放一些静态相关的东西,比如静态变量,静态常量这些,以及全局变量这些。堆是可以动态申请的内存空间,c语言通过申请空间的函数就会申请出来堆空间。java中通过new出来的对象就会存在堆中。而栈,在java中,所有的基本数据类型和引用数据类型都会在栈中存储。包装类型的数据一般会存放在堆中。栈中数据的生存空间一般在当前scopes内(就是由{…}括起来的区域).另外,java中会自动管理堆栈。 在数据结构中,堆是一颗完全二叉树结构。 栈是一种连续存储的数据结构与,其特点就是先进后出的数据存取特点。
其实比较重要的一点认识就是,在java中,堆是用来存放对象的,栈主要是用来执行程序的。栈的存取数据是比较快的,比堆的存取速度要快一些。Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在栈中分 配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。
标签: Java
可能,如果没有对硬件有一个轮廓认识的话,其实一切都似乎是抽象出来的。
要说明的是,堆栈位于RAM中中。当然。栈的存取数据的速度还是仅次于cpu中的寄存器的。 下面是摘录的一些详细的说明 : 1,寄存器,在是cpu中的一块空间,速度比较快…Java不能直接对寄存器操作 2,堆栈位于RAM中,速度仅次于寄存器…将基本数据类型和对象的引用,方法的形式参数存储在栈中 3,堆,也位于RAM中,当你new 一个对象的时候,他会自动在堆里进行分配…将字符串,数组,集合,对象,this等大数据存储在堆中 4.方法区,位于RAM中…存储静态变量,string常量,class 5,常数储存,直接放到代码内部,这样做是安全的,还有就是,他不会被改变. 6,非ram储存 如果数据完全存在于程序之外,那么可以不受程序的控制,在程序没有运行里也可以存在,有两个例子,“流对象”,"持久化对象"
稍微理解一下堆栈,可能会解决一些编程中的疑惑。