详细介绍Java中堆、栈 和常量池的不同使用

详细介绍

Java

中堆、栈

 

常量池的不同使用

 

 

 

 

 

 

 

下面主要介绍

JAVA

中的堆、栈和常量池:

 

 

 

1.

寄存器

 

 

 

最快的存储区,

 

由编译器根据需求进行分配,我们在程序中无法控制。

 

 

 

2. 

 

 

 

存放基本类型的变量数据和对象的引用,

但对象本身不存放在栈中,

而是存放在堆

new 

出来的对象)或者常量池中(字符串常量对象存放在常量池中。

 

 

 

3. 

 

 

 

存放所有

new

出来的对象。

 

 

 

4. 

静态域

 

 

 

存放静态成员(

static

定义的)

 

 

 

5. 

常量池

 

 

 

存放字符串常量和基本类型常量(

public static final

 

 

 

6. 

RAM

存储

 

 

 

硬盘等永久存储空间

 

 

 

这里我们主要关心栈,

堆和常量池,

对于栈和常量池中的对象可以共享,

对于堆中的对

象不可以共享。

栈中的数据大小和生命周期是可以确定的,

当没有引用指向数据时,

这个数

据就会消失。

堆中的对象的由垃圾回收器负责回收,

因此大小和生命周期不需要确定,

具有

很大的灵活性。

 

 

 

对于字符串:

其对象的引用都是存储在栈中的,

如果是编译期已经创建好

(直接用双引

号定义的)的就存储在常量池中,如果是运行期(

new

出来的)才能确定的就存储在堆中。

对于

equals

相等的字符串,在常量池中永远只有一份,在堆中有多份。

 

 

 

如以下代码:

 

 

 

1. String s1 = "china"; 

 

 

2. String s2 = "china"; 

 

 

3. String s3 = "china"; 

 

 

4. String ss1 = new String

"china"

 

 

 

5. String ss2 = new String

"china"

 

 

 

6. String ss3 = new String

"china"

 

 

 

对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。

 

 

 

如以下代码:

 

 

 

1. int i1 = 9; 

 

 

2. int i2 = 9; 

 

 

3. int i3 = 9; 

 

 

4. public static final int INT1 = 9; 

 

 

5. public static final int INT2 = 9; 

 

 

6. public static final int INT3 = 9; 

 

 

对于成员变量和局部变量:

成员变量就是方法外部,

类的内部定义的变量;

局部变量就

是方法或语句块内部定义的变量。

局部变量必须初始化。

形式参数是局部变量,

局部变量的

数据存在于栈内存中。栈内存中的局部变量随着方法的消失而消失。

 

 

 

成员变量存储在堆中的对象里面,由垃圾回收器负责回收。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

www.accpbj.com 

 

 

如以下代码:

 

 

 

1. class BirthDate { 

 

 

2. private int day; 

 

 

3. private int month; 

 

 

4. private int year; 

 

 

5. public BirthDate

int d, int m, int y

 { 

 

 

6. day = d; 

 

 

7. month = m; 

 

 

8. year = y; 

 

 

9. } 

 

 

10. 

省略

get,set

方法……

 } 

 

 

11. public class Test{ public static void main

String args[]

 

 

12. int date = 9; 

 

 

13. Test test = new Test

()

 

 

 

14. test.change

date

 

 

 

15. BirthDate d1= new BirthDate

7,7,1970

 

 

 

16. } 

 

 

17. public void change1

int i

{ i = 1234; 

 

 

18. } 

 

 

对于以上这段代码,

date

为局部变量,

i,d,m,y

都是形参为局部变量,

day,month,year

为成员变量。下面分析一下代码执行时候的变化:

 

 

 

1. main

方法开始执行:

 

 

 

1. int date = 9; 

 

 

date

局部变量,基础类型,引用和值都存在栈中。

 

 

 

2. test

为对象引用,存在栈中,对象(

new Test

()

)存在堆中。

 

 

 

1. Test test = new Test

()

 

 

 

3. 

 

 

1. test.change

date

 

 

 

i

为局部变量,引用和值存在栈中。当方法

change

执行完成后,

i

就会从栈中消失。

 

 

 

4. 

 

 

1. BirthDate d1= new BirthDate

7,7,1970

 

 

 

d1

 

对象引用,存在栈中,对象(

new 

BirthDate

()

)存在堆中,其中

d,m,y

为局部变

量存储在栈中,

且它们的类型为基础类型,

因此它们的数据也存储在栈中。

 day,month,year

为成员变量,它们存储在堆中(

new BirthDate

()里面)

。当

BirthDate

构造方法执行完之

后,

d,m,y

将从栈中消失。

 

 

 

5.main

方法执行完之后,

date

变量,

test,d1

引用将从栈中消失,

new Test

()

new 

BirthDate

()将等待垃圾回收。

 

 

 

希望通过以上内容的介绍,能够给你带来帮助。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值