string和stringBuffer,stringBuilder的区别

  • String对象不能被修改,本身不能修改,但是引用可以修改。
  • String a = "abc" 实在内存里创建了一个String对象 a = a+'c' 实际上是在内存中"abcc" 的String对象
  • stringBuffer和stringBuilder可变
  • stringBuffer效率比stringBuilder低,但是线程安全,而stringBuilder线程不安全
  • 原因在于StringBuffer在append()方法上使用了synchronized,而StringBuilder没有使用。
  • StringBuilder和StringBuffer都继承了AbstractStringBuilder
  • AbstractStringBuilder内有两个非常重要的变量,分别是:char[] value,int count
  • Stringbuff 和Stringbuider 是可以修改,因为value没有加上final
    在这里插入图片描述
  • String可以空赋值,stringBuffer和stringBuilder不行
  • StringBuffer比StringBuilder多了一个toStringCache字段,用来在toString方法中进行缓存,每次append操作之前都先把toStringCache设置为null,若多次连续调用toString方法,可避免每次Arrays.copyOfRange(value, 0, count)操作,节省性能。
    @Override
    public synchronized StringBuffer append(String str) {
        toStringCache = null;
        super.append(str);
        return this;
    }
 
    @Override
    public synchronized String toString() {
        if (toStringCache == null) {
            toStringCache = Arrays.copyOfRange(value, 0, count);
        }
        return new String(toStringCache, true);
    }

单线程StringBuffer与StringBuilder区别

单线程下StringBuffer加了synchronized,虽然是单线程, 但是synchronized获取锁和释放锁也还是需要时间的, 而StringBuilder没有,这个就是重点区别。
StringBuffer虽然是单线程,但它是有偏向锁升级过程判断的,会耗费时间,效率固然低于StringBuilder
StringBuilder没有加任何锁,其效率高,适用单线程场景,但同时也适用于高并发场景中,提高高并发场景下程序的响应性能,至于线程安全问题可以通过其它手段解决,如ThreadLocal,CAS操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值