StringBuffer、StringBuilder和StringJoiner

本文探讨了在Java中StringBuffer、StringBuilder和StringJoiner的使用。StringBuffer是线程安全的字符串缓冲区,适合多线程环境;StringBuilder则在单线程下提供更好的性能。StringJoiner则提供了方便的字符串连接功能,特别是对于有分隔符需求的情况。在关注代码优雅性和效率的同时,选择合适的字符串操作类至关重要。
摘要由CSDN通过智能技术生成

序言

大家在开发中基本上都用过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对象内部的锁,这就是HotSpot虚拟机实现的锁优化技术之一——锁消除(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+""));

 

总结

具体的工具类大家可以自行查阅源码,其实这样用无非是为了写出更优雅的代码,简洁明了。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值