
你就简单的来理解就可以了
堆栈就是两种存放数据的方式
不要new直接来定义的是栈
用new来定义的就是堆
首先来讲解栈
栈的优势是,存取速度比堆要快。但缺点是缺乏灵活性
而堆测试速度慢
但是灵活性好
比如八大基本数据类型
在你int
sum
=
0;的时候
就是sum是一个指向
int
类型的引用,指向0这个字面值
你在顶一个
int
i=0;他会去找有没有0
有的话就会指向它
所以栈具有共享数据的特性
而当你String
str
=
new
String("a");的时候
它就会在堆中建立一个对象
其实你就理解成两种方式的存放数据的方式就行
简单的说 其实 栈 就是存放变量引用的一个地方, 堆 就是存放实际对象的地方 也就是
比如: int i = 7; 这个 其实是存在栈里边的。内容为 i = 7。
Apple app = new Apple(); 这个 app 是在栈里边的 他对应的是一个内存地址也在堆里边, 而这个内存地址对应的是堆里边存放 Apple 实例的地址。
String s = "Hello World!"; 这个其实是存在另外一块静态代码区。
总体来说: 栈--主要存放引用 和基本数据类型。
堆--用来存放 new 出来的对象实例。
堆栈是计算机为程序分配的内存空间,用来存储数据的。
内存是计算机系统中一个主要部件, 用于保存进程运行时的程序和数据,也称可执行存储器。在计算机中,内存空间一般是指主存储器空间(物理地址空间)或系统为一个用户程序分配内存空间。扩展内存空间的方法一般有增加内存大小和虚拟内存。
源程序经过汇编或编译后再经过链接编辑程序加工形成的程序的装配模块,及转换为相对地址编址的模块,它是以0为基址顺序进行编址的。
相对地址也称为逻辑地址或虚拟地址,把程序中由相对地址组成的空间叫做逻辑地址空间。相对地址空间通过地址再定位机构转换到绝对地址空间,绝对地址空间也叫物理地址空间。
内存空间一般是指主存储器空间(物理地址空间)或系统为一个用户程序分配内存空间。系统为一个用户程序分配内存空间方法有单一连续分配、固定分区分配、动态分区分配以及动态重定位分区分配四种方式。
为了便于内存分配,通常将分区按大小进行排队,并为之建立一张分区使用表,其中各表项包括每个分区的起始地址、大小及状态(是否已分配)。
当有一用户程序要装入时,由内存分配程序检索该表,从中找出一个能满足要求的、尚未分配的分区,将之分配给该程序,然后将该表项中的状态置为“已分配” ;若未找到大小足够的分区,则拒绝为该用户程序分配内存。
1、java中所有变量(包括你上述提及的str引用类型变量)的存放位置都取决于该
变量的声明位置,而New出的对象则始终被JVM存放在堆中,创建的字串常
量则始终被JVM存放在数据段区常量池中。
2、你对第一个str引用变量存放位置的解释有一点欠妥的地方,准确的说这个
str的存放位置不一定在栈中,这要看str的声明位置,如果str是方法参数中
声明或方法内局部变量声明则存放位置就是你说的在栈中,但如果在类的成
员变量中声明则是存放于堆中。“abc”是一个字串常量被存放于常量池中而
该常量返回的引用地址被存放于str变量中,str变量的位置取决于str的声明
位置。
3、第二种方式String str = new String("abc");其实上是创建了两个对象,
与上述相同,字串常量对象被放在常量池中,这个常量“abc”与上面第一个
创建的“abc”是同一个abc,常量池中不能保存相同面值的常量,而New出的
新对象new String("abc")则存放在堆中,这里的“abc”的位置存在于堆
中,与上述常量池中的“abc”不是同一个“abc”,这里一定要注意啊,而
str变量的存放位置与第一个str的存放位置都是取决于该str的声明位置。
4、解释引用变量存放位置的原理:对象在创建时将为所有的成员变量分配内存
空间以及为所有的成员方法分配入口地址,因为对象是对属性及方法的封装
而对象在创建时被分配到堆中的空间,因此成员变量被分配在堆中,而方法
时在调用时为局部参数或变量临时分配内存空间,在此,方法在调用时被JVM
线程加载至栈中,于此局部变量及参数的所在位置存在与栈中,这些局部变
量及参数所占空间是临时的,一旦方法调用结束其临时空间将被释放,所以
内存栈区空间是为变量分配的临时存贮空间,这个你可以参考马士兵的堆栈
视屏教程,他讲述的很清楚,我可能还没有他表达得清楚。
5、最后再强调一点:变量不是都放在栈中,这取决于该变量的声明位置,我的
这种说法你能理解吗?只有理解了这一点,在出现堆栈问题或缓存遗留问题
时才能根据问题的出发点找到问题的出处。
首先堆栈是计算机为程序分配的内存空间,用来存储数据的。
在java中因为我们不直接 *** 作内存,所以并不需要考虑指针的问题
在java中堆和栈也是用来存储数据,其中栈存储的引用,堆存储的对象
如:Student s = new Student("张三");
s在栈中 张三在堆
出站之前加入一个if 语句 判断是否为空 如果为空就抛出异常
具体如下
import javautilVector;
class VectorStack {
static final int CAPACITY = 5;
Vector v;
VectorStack() {
v = new Vector();
}
void push(Object obj) {
vaddElement(obj);
Systemoutprint(" PUSH:" + obj);
}
Object pop() throws Exception{
if(vsize()==0)
throw new Exception("栈为空");
Object obj = vlastElement();
vremoveElementAt(vsize() - 1);
Systemoutprintln(" Pop:" + obj);
return obj;
}
}
测试程序如下
public class t {
public static void main(String[] args) throws Exception{
VectorStack vs = new VectorStack();
vspop();
}
}
其实最好是自己看下关于异常的书籍或者视频
首先栈中的基本数据类型的大小就是基本数据类型本身的大小 char 2位 int 32位
引用类型在栈中就是存个地址 栈中的地址大小是由引用的对象确定的 既然引用对象知道了那地址也知道了 引用的生存期就是他与对象的关联的时间
Java中堆栈的概念当然是逻辑上的,在完全符合Java规范的Java处理器面世之前,所有Java虚拟机提供的内容都是由软件模拟出来的。
什么叫堆?你用十几个麻将牌竖直叠成一摞这叫堆,你可以从上面、下面、中间任意抽出一张牌,也可以任意插入一张。
什么叫栈?AK-47的d匣就是一个栈,在上面的子d没被取出之前,你无法取出下面的子d——尽管你可以从边上的透明部分读出里面装的是什么型号、颜色的子d。
堆很灵活,但是不安全。对于对象,我们要动态地创建、销毁,不能说后创建的对象没有销毁,先前创建的对象就不能销毁,那样的话我们的程序就寸步难行,所以Java中用堆来存储对象。而一旦堆中的对象被销毁,我们继续引用这个对象的话,就会出现著名的 NullPointerException,这就是堆的缺点——错误的引用逻辑只有在运行时才会被发现。
栈不灵活,但是很严格,是安全的,易于管理。因为只要上面的引用没有销毁,下面引用就一定还在,所以,在栈中,上面引用永远可以通过下面引用来查找对象,同时如果确认某一区间的内容会一起存在、一起销毁,也可以上下互相引用。在大部分程序中,都是先定义的变量、引用先进栈,后定义的后进栈,同时,区块内部的变量、引用在进入区块时压栈,区块结束时出栈,理解了这种机制,我们就可以很方便地理解各种编程语言的作用域的概念了,同时这也是栈的优点——错误的引用逻辑在编译时就可以被发现。
在Java中,引用可以理解为一个永远指向对象的指针,Java没有指向指针的指针。
关于堆栈的资料几乎每个讲数据结构的书上都有,而至于Java中堆、栈的具体机制你可以参考一些关于Java虚拟机原理的书,不过这个好像比较难理解,我是没指望理解的了。
以上都是我的个人观点,仅供参考。
以上就是关于java 基础堆栈全部的内容,包括:java 基础堆栈、java中的堆栈详解、java中的“堆栈”是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)