其他分享
首页 > 其他分享> > StringBuffer、StringBuilder和StringJoiner

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