标签:StringBuffer 线程 StringJoiner StringBuilder 方法 append
序言
大家在开发中基本上都用过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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。