StringBuffer、StringBuilder和StringJoiner
作者:互联网
序言
大家在开发中基本上都用过StringBuffer和StringBuilder,最近看到一篇文章说StringJoiner可以替代StringBuilder,那么这篇文章就来看一下这个说的东东吧,放一下链接:
https://mp.weixin.qq.com/s/LBe2CSTPfgbzcgFmOt7lEg
StringBuffer
StringBuffer用来存放字符串变量,可不断追加,类似于字符串缓冲区,且是线程安全的。
阅读源码是了解设计方法最有效的方法,我们先看源码,具体细节自行查看StringBuffer类,下面是我个人认为的比较重要的点:
抽象类AbstractStringBuilder实现了Appendable接口的append方法,该方法确保原有的字符序列长度加上追加字符序列长度符合(ensureCapacityInternal方法,不符合则复制到新的字符序列上)后进行序列追加。
StringBuffer继承了抽象类AbstractStringBuilder,它定义了一个不会被序列化的字符数组toStringCache,重写了一些方法(如length、capacity、ensureCapacity、trimToSize、append、delete、deleteCharAt、replace、subString、insert、writeObject等),这些重写的方法都是加了synchronized关键字,锁定调用方法。
StringBuffer的append如果都在一个方法里,不被其他线程引用,JVM会自动消除StringBuffer对象内部的锁,这就是JVM所做的优化——锁消除(lock eliminate)。
StringBuilder
StringBuilder基本上和StringBuffer类似,它是线程不安全的,在字符串缓冲区被单个线程使用时用它来替代StringBuffer很常见,毕竟它比StringBuffer要快很多。
StringBuilder也是继承了抽象类AbstractStringBuilder,可以看到被重写的方法是没有加synchronized关键字的,大多数情况下,我们都是在单线程的情况下使用字符串缓冲区,用StringBuilder性能更好。
StringJoiner
看到的那篇文章就是说StringBuilder不支持分割,如果有这样的需求需要像下面这样写,
StringBuilder sb = new StringBuilder();
IntStream.range(1,10).forEach(i->{
sb.append(i+"");
if( i < 10){
sb.append(",")
}
});
而StringJoiner的有参构造函数把字符串分三块——前缀prefix、分隔符delimiter、后缀suffix,看起来是方便不少。
StringJoiner sj = new StringJoiner(",");
IntStream.range(1,10).forEach(i->sj.add(i+""));
总结
具体的工具类大家可以自行查阅源码,其实这样用无非是为了写出更优雅的代码,简洁明了。
标签:StringBuffer,线程,StringJoiner,StringBuilder,方法,append 来源: https://blog.csdn.net/zkkzpp258/article/details/116864630