Java中的堆、栈和常量池

Java中的堆、栈和常量池

堆:存放所有new出来的对象;
栈:存放基本数据类型和对象的引用,对象本身并不是存放在栈中,而是存放在堆中或者常量池中;
常量池:存放基本数据类型的常量和字符串常量;

对于字符串来说,其对象的引用都是存储在栈中的,如果编译期已经创建好了(即用引号定义的字符串,如:String str = “Java”)就存储在常量池中,如果是运行期(即new出来的对象)则存储在堆中。对于equals相等的字符串,在常量池中只有一份,但在堆中可能会有多份。

举个例子:

String str1 = “abc”;
String str2 = “abc”;
String str3 = “abc”;
String str4 = new String(“abc”);
String str5 = new String(“abc”);
String str6 = new String(“abc”);

这里写图片描述

通过new操作产生一个字符串(”abc”)时,会先去常量池中查找是否有”abc”对象,如果没有则在常量池中创建一个此字符串对象,然后再在堆中创建一个常量池中此”abc”对象的拷贝对象,所以,对于String str = new String(“abc”),如果常量池中原来没有”abc”则产生两个对象,否则产生一个对象。

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

int a1 = 1, a2 = 1, a3 = 1;
public static final int INT1 = 1;
public static final int INT2 = 1;
public static final int INT3 = 1;

这里写图片描述

一个String对象在堆内存中创建以后, 就不能被改变了. 请注意String对象的所有方法都不会改变其本身,而是会返回一个新的String对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值