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 array
return new String(value, 0, count);
}

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

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

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

区别3:性能

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

总结

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

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

本文原创首发于微信公众号:Java技术栈(id:javastack),关注公众号在后台回复 "Java" 可获取更多,转载请原样保留本信息。

StringBuffer 和 StringBuilder 的 3 个区别的更多相关文章

  1. Java中的String、StringBuffer以及StringBuilder的用法和区别

    String String的构造方式有n种(据说n==11),常见的例举一二: String s1 = "hello world"; String s2 = new String( ...

  2. java基础知识回顾之---java StringBuffer,Stringbuilder与String的区别

    public class StringBuilderTest { /** * StringBuffer和Stringbuilder :使用与内容可以被修改的字符串 * 与String的区别:Strin ...

  3. Java中的String,StringBuffer,StringBuilder详解与区别

    1.String Java中string类是不可变的,其中在声明的源代码中用的final,所以只能声明一次.所以每次在明面上的改变其实是重新生成一个String对象,指针指向新的String对象.同时 ...

  4. String、StringBuffer、StringBuilder和StringTokenizer的区别

    1)String.StringBuffer.StringBuilder都用于字符串操作,其中,String是不可变类,即String对象一旦被创建,其值不能被修改,而StringBuffer和Stri ...

  5. Java中String、StringBuffer、StringBuilder、StringTokenizer的区别

    Java语言中,有4个类可以对字符或字符串进行操作,它们是Character.String.StringBuffer.StringTokenizer,其中Character用于单个字符操作,Strin ...

  6. String、Stringbuffer、Stringbuilder三者之间的区别

    1.首先说运行速度,速度由快到慢排列:StringBuilder > StringBuffer > String String最慢的原因: String为字符串常量,而StringBuil ...

  7. java ->String、StringBuffer、StringBuilder三者之间的区别

    1.首先说运行速度,速度由快到慢排列:StringBuilder > StringBuffer > String String最慢的原因: String为字符串常量,而StringBuil ...

  8. StringBuffer与StringBuilder的作用与区别

    来自为知笔记(Wiz)

  9. String和StringBuffer以及StringBuilder的区别

    今天在读<java编程思想>的时间,在看到String和StringBuffer以及StringBuffer这三个类的时间,做一个随笔小结,为自己的面试做好准备! 一:String,Str ...

随机推荐

  1. oracle12C安装步骤

    首先去官网下载两个架包链接如下:官网链接 第一步:将两个架包解压到同一个database目录下.如截图所示: 第二步:打开setup应用程序 打开后就到了下面这个页面 第三步:配置安全更新 环境变量配 ...

  2. DNN原理探究系列之目录与序章篇

    序言: 神经网络结构,作为最成功的机器学习模型之一,其工作原理一直被埋藏得比较深,其解释性以至于被称为黑盒. 自己对于DNN的理解也只能算刚踏入了门槛,对于人脑的原理与DNN原理之间的互通性,一直是非 ...

  3. MongoDB学习记录(四) - MongoDB的"增查改删"操作之"改"

    更新文档主要有以下几种方法: db.collection.updateOne(filter, update, options) db.collection.updateMany(filter, upd ...

  4. 2019.03.09 bzoj4491: 我也不知道题目名字是什么(线段树)

    传送门 题意:给定一个序列A[i],每次询问l,r,求[l,r]内最长子串,使得该子串为不上升子串或不下降子串. 思路: 注意要求的是子串而不是子序列!!! 然后直接用线段树维护最大子段和的方式合并一 ...

  5. Effective Java 【考虑实现Comparable接口】

    Effective Java --Comparable接口 compareTo方法是Comparable接口的唯一方法.类实现了Comparable接口,表明它的实例具有内在的排序关系. 自己实现co ...

  6. 在windows系统安装pygame项目

    STEP1: 下载安装程序 访问https://bitbucket.org/pygame/pygame/downloads/,查找与你运行的Python版本匹配的安装程序,如果找不到,可以去https ...

  7. 《java从入门到精通》学习记录

    目录 <Java从入门到精通>学习记录 3 基础的基础部分: 3 一. 常量与变量 3 1. 掌握: 3 (1) .常量与变量的声明方式: 3 (2) .变量的命名规则: 3 (3) .变 ...

  8. OC中NSString的使用、字符串的使用

    字符串作为OC语言的基本对象类型,被我们在各种地方广泛使用,因此熟悉掌握字符串的属性和方法,是OC必不可少的基础之一. 字符串分为可变字符串(NSMutableString)和不可变字符串(NSStr ...

  9. 数据库(mysql)相关知识

      单表查询   排序   升序   select*from表名 order by字段 asc;   降序   select*from表名 order by字段 desc;   条件查询(包括通配符) ...

  10. vb越界

    想起来一个项目当中,遇到了一个问题,就是老是显示数据溢出. 后来查查查,发现是由于vb的特性造成的.例如cbyte()函数.此函数()里面的数据运算也不能超过cbyte的范围,不然就回发生溢出问题.