String、StringBuilder、StringBuffer

1.介绍。

String是典型的immutable类(不可变类)。不可变类就是类对象一旦创建后就完全不可改变。类和属性都是final修饰的。由于它的不可变性,所以对字符串的裁剪拼接等操作都会产生新的String对象,会影响性能。

StringBuilder:StringBuilder解决了String拼接产生多对象的问题,广泛用来拼接字符串。但是线程不安全。

StringBuffer:StringBuffer和StringBuilder相比没有本质区别,用法也基本一致。不同的是StringBuffer是线程安全的,实现线程安全的方式就是在各种修改数据的方法上都加上了synchronized关键字。

2.底层实现方式。

String是用数组来存储数据的(历史版本是char数组,java9开始使用byte数组加上一个标识编码的coder).

StringBuilder和StringBuffer底层都是利用科修改的数组(历史版本char数组,java9改为byte数组),二者都继承了AbstractStringBuilder。长度实现是初始字符串长度加16,超过的时候就再扩容,为了减少扩容的开销,如果一开始大小基本确定的话就指定大小。

3.String的创建机制。

java为了避免在一个系统中产生大量的String对象,引入了常量池,运行机制是创建一个字符创的时候首先检查常量池中有没有,如果有就直接引用,没有再创建新的字符创,并将新建的放入池中。注意:常量池中的字符创不会回收,所以尽量少的定义字符串。另外通过new方式创建的不会放在常量池。

4.字符串的intern方法。

intern方法目的是提示jvm把相应字符串缓存起来以备重复使用,我们创建字符串并调用inter的时候如果已经有缓存的字符串就返回缓存里的实例,否则将其缓存起来。但空间有限,使用不当会造成OOM(OutOfMemaryError)。

 

参考:杨晓峰《java核心技术36讲》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值