StringBuffer 和 StringBuilder 的区别

StringBuffer 和 StringBuilder 的类结构:

在这里插入图片描述

区别1:线程安全

StringBuffer:线程安全,StringBuilder:线程不安全。因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 synchronized 修饰。

StringBuffer 代码片段:
在这里插入图片描述

StringBuilder 代码片段:
在这里插入图片描述

区别2:缓冲区

StringBuffer 代码片段:
在这里插入图片描述

StringBuilder 代码片段:
在这里插入图片描述
StringBuffer 每次获取 toString 都会直接使用缓存区的 toStringCache 值来构造一个字符串。

StringBuilder 则每次都需要复制一次字符数组,再构造一个字符串。

所以, StringBuffer 对缓存区优化,不过 StringBuffer 的这个toString 方法仍然是同步的。

区别3:性能

既然 StringBuffer 是线程安全的,它的所有公开方法都是同步的,StringBuilder 是没有对方法加锁同步的,所以毫无疑问,StringBuilder 的性能要远大于 StringBuffer。

总结

StringBuffer 适用于用在多线程操作同一个 StringBuffer 的场景,如果是单线程场合 StringBuilder 更适合。

                                </div><div><div></div></div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-60ecaf1f42.css" rel="stylesheet">
                                <div></div>
                    
        <div class="person-messagebox">
            <div class="left-message"><a href="https://blog.csdn.net/changgebuyu">
                <img src="https://profile.csdnimg.cn/D/7/4/3_changgebuyu" class="avatar_pic" username="changgebuyu">
            </a></div>
            <div class="middle-message">
                                    <div class="title"><span class="tit "><a href="https://blog.csdn.net/changgebuyu" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;,&quot;ab&quot;:&quot;new&quot;}" target="_blank">深水流静</a></span>
                    <!-- 等级,level -->
                                            <img class="identity-icon" src="https://csdnimg.cn/identity/blog2.png">                                            </div>
                <div class="text"><span>原创文章 5</span><span>获赞 3</span><span>访问量 2688</span></div>
            </div>
                            <div class="right-message">
                                        <a class="btn btn-sm  bt-button personal-watch" data-report-click="{&quot;mod&quot;:&quot;popu_379&quot;,&quot;ab&quot;:&quot;new&quot;,&quot;extend1&quot;:&quot;个人信息未关注&quot;}">关注</a>
                                                            <a href="https://im.csdn.net/im/main.html?userName=changgebuyu" target="_blank" class="btn btn-sm bt-button personal-letter">私信
                    </a>
                                </div>
                        </div>
                    
    </div>
synchronized
  • 一段synchronized代码被执行之前,他要先拿到着段代码的执行权限,在Java里面就是拿到某个同步对象的锁(一个对象只有一把锁);如果这个时候同步对象的锁被其它线程拿走了,那它这个线程就只能等待,(线程阻塞在锁城队列中),取到锁后,他就开始执行同步代码,线程执行完同步代码后马上就把锁还给同步对象,其它在锁池中等待的某个线程就可以拿到同步锁执行同步代码了,这样就保证同步代码在同一时刻是有一个线程在执行
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值