字符串常量池问题

字符串常量池:

首先说为什么需要字符串常量池?

那就得从字符串说起了,创建一个对象要为它付出时间和空间上的开销。字符串可以说是和8个基本数据类型一样常用的类型,甚至比8个基本类型更加常用,因此需要频繁的创建字符串对象,大量的对象对程序性能的影响非常大,所以用常量池的方式可以很大程度降低对象的创建、分配次数,从而提升性能。(JDK1.7(包括1.7) 之后,字符串常量池便从方法区移到堆中)

为什么字符串常量没有像其他对象直接存在堆中

字符串有两种创建方式:

String s1 = "abcde"; // 第一种方式

String s2 = new String("abcde"); //第二种方式

第一种方式生命字符串变量是最常用的方式,叫做字面量声明,也就是吧字符串用双引号引起来,直接赋值给一个变量。这种情况下,会直接将字符串放到字符串常量池中,然后变量只想池中的地址。

如果此时在声明一个相同的字符串,会发现在池中已经存在,则变量直接指向池中的地址

第二种方式除非有特殊的逻辑,否则不建议用

如果在new之前池中已经有了相同内容的字符串常量,首先会在堆中创建一个变量的引用对象,然后将这个引用对象指向字符串常量池中已经存在的常量

如果在new之前池中没有相同内容的字符串常量,用 new String 的方式第一次声明这个字符串,则在堆中创建一个字符串对象,然后返回给变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值