String类小细节

String类细节问题

字符串常量池

JDK8 字符串常量池放到堆空间,其引用指向元空间(方法区)的常量池。常量池设计就是一种缓存池,为了提高程序性能。

1、为字符串开辟一个字符串常量池,类似于缓冲区

2、创建字符串常量时,首先查询字符串常量池是否存在该字符串

3、若存在该字符串,返回引用实力,若不存在,实例化该字符串并放入池中

String str1 = "123";
String str2 = "123";

由上述常量池的定义可见,str1 == str2 结果应为true

虽然定义了两个String对象,但实际在堆内存中只存在一份“123”对象

如图:

在这里插入图片描述

引发问题 String str = new String(“123”) 创建了几个对象?

答案分应两种情况:2 || 1

创建一个对象的情况:

字符串常量池中存在“123”的String对象,这时在堆内存中的创建一个String类型的对象,不需要额外创建对象。

创建两个对象的情况:

字符串常量池中不存在"123",这时在堆内存中需要创建一个String类型对象,且需要在字符串常量池中放入一个值为“123”的对象

不建议使用String类来拼接字符串

String 类是由final修饰的,该类无法被继承。同时它的所有属性也是final修饰的,也不可变,当如需要字符串拼接,裁剪字符串等操作都会创建一个新的对象

在这里插入图片描述

案例

String str = "123";
       str += "123";
       str += "123";

图示分析

在这里插入图片描述

由图可知 在 += 拼接的过程中一共产出了2个多余的字符串,所以尽量不要使用String进行字符串拼接,需要进行字符串拼接的话尽量使用StringBuilder对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值