前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java|String、StringBuffer和StringBuilder的区别

Java|String、StringBuffer和StringBuilder的区别

作者头像
算法与编程之美
发布2020-08-17 16:09:56
4340
发布2020-08-17 16:09:56
举报

问题描述

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

java.lang.String、java.lang.StringBuffer、java.lang.StringBuilder.

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

解决方案

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

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

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

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

StringBuffer与StringBuilder都是继承自同一个抽象类,基本上方法都一样,实现也几乎都是一样的。而StringBuffer比StringBuilder效率低一些的原因就是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

实习编辑 | 王文星

责 编 | 雀 跃

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与编程之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档