小白对于java栈空间与堆空间的学习笔记

Java栈空间与堆空间

以下是我自己在看别人的关于java栈与堆博客所总结的笔记如有大佬路过还请指出其中的错误

参考博客:https://www.cnblogs.com/ibelieve618/p/6380328.html

栈空间特点:1. 栈空间的存储空间较小,无法存放大量数据

2. 栈空间数据是按照先进后出的方式管理;

3. 栈空间存取数据效率高

4. Java将基本数据类型的数据存放到栈空间

堆空间特点:

1.堆空间的存取效率低

2.堆空间的空间大,可以容纳大量的数据

3.在堆空间中的数据存放的位置是随机分配的

Java对栈空间和堆空间的运用:

Java对栈空间的运用:当我们在创建一个变量时,在栈空间中会开辟一个空间来存放变量的类型和变量名。当我们在给基本数据类型赋值时他的值同样也是存放在栈空间中,而在给引用类型赋值时,变量名时存放在栈空间中而数据时存放在堆空间中。

Java对堆空间的运用:当我们创建的变量类型不是基本数据类型而是引用类型的数据时,就要用到堆空间,所以堆空间在java中存放的数据是引用类型的数据比如:数组、字符串、对象。

用四个例子来具体解释栈空间与堆空间:

例1:

第一步:这个例子中因为main函数是程序的入口所以JVM(java虚拟机不深讲感兴趣自己度娘)先执行,在栈空间中开辟一个String类型变量名为i的空间,同时赋值asdfsa;

第二步:JVM执行sd函数,在栈空间中开辟一个String类型变量名为i的空间,同时赋值d;

第三步:当sd()执行完后,变量i会立即释放掉,空间消失,但main()函数的空间仍然存在,变量i并未被释放所以不会受到影响。

 

 

 

例2关于数组:

 

执行String[]i =new String[3]

  当JVM执行main函数时,在栈空间中开辟一个空间,存放数组变量i,同时在堆空间中也开辟一个空间,存放new String[3]数组,堆内存会自动分配首地址值(和身份证差不多),如0x0045。数组在堆内存中的地址值就会附给i,这样i就引用了这个数组(这就相当于给了i一把可以连接new String[3]数组的钥匙),这时因为数组中的元素没有附值,所以都为默认初始值0

 

例3还是关于数组的:

 

第一步和例2一样所以略;

第二步执行i = null

Null为空值,即i的引用的数组的内存地址被删除了,不在指向(引用)堆内存中的数组(相当于把在第一步给i的钥匙拿走了,使得i不能连接数组)。因为堆中的数组不在被i引用,所以被视为垃圾,JVM就会启动垃圾回收机制,不定时自动删除

例4不好意思还是关于数组的:

 

第一步和例2一样所以你们懂的;

第二步执行String[]y = i:在栈空间中开辟一个空间,存放数组变量变量y,并把i的内存地址值附给y,使得变量y也引用new String[3]数组

第三步执行i = null:i不在指向(引用)堆内存中的数组,而变量y仍然指向数组,所以数组不会消失

例5关于对象:

不好意思没截图

Main()

Car c = new Car();

c.color = “blue”;

Car c1 = new Car();

c1.color = “red”;

第一步执行Car c = new Car():JVM执行main函数,在栈空间中开辟一个空间,存放对象c,同时在堆空间中也开辟出一个空间,用来存放new Car(),堆内存会自动分配首地址值。new Car()在堆内存中的地址值就会附给i,这样c就引用了这个数组.

第二步执行c.color = “blue”:

在对象c所引用的堆中添加进color = “blue”;

第三步执行Car c1 = new Car()和第四步c1.color = “red”:

同第一、二步一样

注意:在这个例子中虽然两个对象都是引用new Car()但两个对象是不同的,每一次使用new 关键字,实际上都会在堆空间中开辟出一个空间来容纳。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值