Java|String、StringBuffer和StringBuilder的区别

前提是你 提交于 2020-12-09 08:02:53

欢迎点击「算法与编程之美」↑关注我们!

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。


欢迎加入团队圈子!与作者面对面!直接点击!


问题描述

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 团队


   

微信号:算法与编程之美          

长按识别二维码关注我们!

温馨提示:点击页面右下角“写留言”发表评论,期待您的参与!期待您的转发!

本文分享自微信公众号 - 算法与编程之美(algo_coding)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!