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="{"mod":"popu_379","ab":"new"}" 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="{"mod":"popu_379","ab":"new","extend1":"个人信息未关注"}">关注</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里面就是拿到某个同步对象的锁(一个对象只有一把锁);如果这个时候同步对象的锁被其它线程拿走了,那它这个线程就只能等待,(线程阻塞在锁城队列中),取到锁后,他就开始执行同步代码,线程执行完同步代码后马上就把锁还给同步对象,其它在锁池中等待的某个线程就可以拿到同步锁执行同步代码了,这样就保证同步代码在同一时刻是有一个线程在执行