StringBuffer 和 StringBuilder 它们都是可变的字符串,不过它们之间的区别是 Java 初中级面试出现几率十分高的一道题。

这么简单的一道题,栈长在最近的面试过程中,却经常遇到很多求职者说反,搞不清使用场景的情况。

今天,栈长我带大家彻底搞懂 StringBuffer 和 StringBuilder 的几个区别和它们的应用场景,如果你是大牛,请略过,如果你是菜鸟,或者对这两个不是很清楚,可以学习一下,也可以为年底的面试加油冲刺。

先看看 StringBuffer 和 StringBuilder 的类结构吧:

其实很简单,就是继承了一个抽象的字符串父类:AbstractStringBuilder。下面我们再来看看它们的三个区别。

区别1:线程安全

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

StringBuffer 代码片段:

@Override
public synchronized StringBuffer append(String str) {toStringCache = null;super.append(str);return this;
}

区别2:缓冲区

StringBuffer 代码片段:

private transient char[] toStringCache;@Override
public synchronized String toString() {if (toStringCache == null) {toStringCache = Arrays.copyOfRange(value, 0, count);}return new String(toStringCache, true);
}

StringBuilder 代码片段:

@Override
public String toString() {// Create a copy, don't share the arrayreturn new String(value, 0, count);
}

可以看出,StringBuffer 每次获取 toString 都会直接使用缓存区的 toStringCache 值来构造一个字符串。

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

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

区别3:性能

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

总结

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

以此送给正在面试或者即将去面试的 Java 程序猿们,如果对你有帮助,也欢迎分享给身边的朋友们,让大家少走弯路。

StringBuffer 和 StringBuilder 的 3 个区别!相关推荐

  1. StringBuffer 和 StringBuilder 的 3 个区别

    2019独角兽企业重金招聘Python工程师标准>>> StringBuffer 和 StringBuilder 它们都是可变的字符串,不过它们之间的区别是 Java 初中级面试出现 ...

  2. StringBuffer与StringBuilder的作用与区别

    来自为知笔记(Wiz) 转载于:https://www.cnblogs.com/wang3680/p/c414ab02085dea1cfe44f45f9b28a7b7.html

  3. Java 之String、StringBuffer 和 StringBuilder 三者区别介绍

    String:字符串常量,字符串长度不可变,StringBuffer:字符串变量(Synchronized,即线程安全),StringBuilder:字符串变量(非线程安全). String Stri ...

  4. String , StringBuffer 和 StringBuilder 区别

    转载:http://www.blogjava.net/chenpengyi/archive/2006/05/04/44492.html 相信大家对 String 和 StringBuffer 的区别也 ...

  5. String,StringBuffer和StringBuilder区别?

    String是字符串常量,final修饰;StringBuffer字符串变量(线程安全);StringBuilder 字符串变量(线程不安全).此外StringBuilder和StringBuffer ...

  6. 1.19 String、StringBuffer和StringBuilder类的区别

    在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串.String 类是不可变类,即一旦一个 String 对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至 ...

  7. php 有 stringbuffer,string,stringbuffer以及stringbuilder的区别

    string,stringbuffer以及stringbuilder的区别? 小编在一次电话面试中,被问过StringBuilder是线程安全的吗,脱口而出是安全的,结果人家质疑我你是2年开发经验吗. ...

  8. JavaSE(二十五)——String与StringBuffer、StringBuilder的区别、创建对象的几种方法、Http和Https的区别

    文章目录 1. String与StringBuffer.StringBuilder的区别 2. Java创建对象的几种方法 3. Http和Https的区别 1. String与StringBuffe ...

  9. String,StringBuffer与StringBuilder的区别

    String,StringBuffer与StringBuilder的区别 String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全 ...

最新文章

  1. 王者争雄服务器维护,王者争雄_王者争雄官网_攻略-第一手游网
  2. 手工安装kubernetes
  3. 香蕉派路由功Openwrt、Android功耗对照測试
  4. 《数据库SQL实战》查找入职员工时间排名倒数第三的员工的所有信息
  5. Cheatsheet: 2010 04.26 ~ 04.30
  6. 查看目录是否为内存盘_Linux buff/cache内存释放
  7. L1-017 到底有多二 (15 分)
  8. 虚拟机网络模式与网络配置
  9. Windows Terminal Preview 1.5 发布
  10. ajax点击a load,jQuery:在ajax load()之后运行脚本
  11. HDU 2186--
  12. strong,weak, retain, assign的区别@property的参数
  13. openai-gpt_为什么GPT-3感觉像是编程
  14. Python教你实现微信防撤回~
  15. win7下桌面IE快捷方式无法删除解决方法
  16. 常用遥感SIF和GPP数据集
  17. 【pytorch图像分类】AlexNet网络结构
  18. 进阶篇:4.1)DFA设计指南:简化产品设计(kiss原则)
  19. oracle中书写规范,oracle sql书写规范
  20. 不去摄影棚,不用PS三步快速证件照换底色最简单方式

热门文章

  1. 鸟哥的Linux私房菜(基础篇)- 第十一章、认识与学习 BASH
  2. SimpleDateFormat-时间格式化中的大小写字符
  3. JavaScript对象继续总结
  4. (转)Spring管理的Bean的生命周期
  5. linux下ftp服务器的搭建与使用
  6. lt;xliff:ggt;标签
  7. busybox在android开发中的应用
  8. 软链接和硬链接的解读
  9. 保护数据安全的三种武器
  10. PCL点云库用贪婪投影三角法网格化实现点云的表面重建