分享

Java|String、StringBuffer和StringBuilder的区别

 算法与编程之美 2020-08-13

问题描述

JAVA中用于处理字符串常用的有三个类:

java.lang.String、java.lang.StringBufferjava.lang.StringBuilder.

这三个类有共同点,都是final,不允许被继承。同时也有一些区别,下面简单介绍一下它们的区别。

解决方案

这三个类之间的区别主要是运行速度和线程安全这两方面的区别。

在运行速度这方面,快慢比较的情况是:StringBuilder > StringBuffer > String

String最慢的原因:String为字符串常量,字符串长度不可变。Java String 是不可变的,String对象一旦创建之后该对象是不可更改的。所以,Java中对String对象进行的操作实际上是创建新的对象并把旧的对象进行回收,所以执行速度很慢。

StringBuilder和StringBuffer的对象是变量,是可变的,可以直接对StringBuilderStringBuffer的对象进行更改,而不用创建新对象再回收,所以速度要比String快很多。

StringBuffer与StringBuilder都是继承自同一个抽象类,基本上方法都一样,实现也几乎都是一样的。而StringBufferStringBuilder效率低一些的原因就是StringBuffer的几乎所有方法都加了synchronized。我们可以看一下源码。

java.lang.StringBuilder

    public StringBuilder append(String str) {

        super.append(str);

        return this;

    }

java.lang.StringBuffer

public synchronized StringBuffer append(String str) {

        toStringCache = null;

        super.append(str);

        return this;

    }

StringBuffer类的append方法,是被synchronized所修饰的。所以每次操作都要校验线程是否持有锁。相当于开门的时候,StringBuffer是用钥匙去开锁再推门,而StringBuilder是直接推门。所以从效率上来看自然是StringBuilder效率更高。

在线程安全这方面,StringBuilder是线程不安全的,而StringBuffer是线程安全的。多线程环境下,因为StringBuffer几乎所有方法都带有synchronized关键字,可以保证线程是安全的,但StringBuilder的方法则没有,所以不能保证线程安全,因此在多线程环境下有可能出现错乱。

结语

在只有少量的字符串操作时,推荐使用String。

在大量的字符串操作时,如果是单线程操作,请选择StringBuilder;但涉及到多线程操作同一个字符串时,请使用StringBuffer


END

实习编辑   |   王文星

责       编   |   雀    跃

 where2go 团队


微信号:算法与编程之美          

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多