【简要回答】

回答纲要:

首先一句话引入。

接着分别介绍三种:

1、不变性

2、线程安全性

3、性能和使用场景

最后简要总结。


【详细回答】

三种类型都可以用来创建字符串对象,底层都是使用字符数组实现的。


String

不变性:

String是不可变类,底层实现是用final修饰的,因此String对象不能被修改也不能继承,对String类型的字符串修改时,不会在原String对象上修改而是会new一个新对象存储修改后的String。

安全性:

由于 String 是不可变的,所以是线程安全的。

性能和场景:

但由于频繁创建String对象会引起额外内存开销,频繁gc也会造成内存抖动,因此适合读多写少的场景,例如常量的声明、少量的变量运算。


StringBuffer

不变性:

AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。他们两个都是可变的。

安全性:

StringBuffer底层实现上,使用了synchronized/ˈsɪŋkrənʌɪz/修饰,属于加了同步锁,同一时刻只能由一个线程对字符串进行处理,因此是线程安全的。此外StringBuffer可以对对象进行修改而无须创建新的对象。

性能和场景:

性能一般,适用于并发编程,适合多线程并发对字符串处理的场景。

在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用 StringBuffer,例如多个线程拼接日志、解析共享 XML 文本内容等。


StringBuilder

不变性:

是可变的。

安全性:

StringBuilder可以直接对字符串进行修改而无需创建新的字符串,对比StringBuffer是线程不安全的,但在单线程时也减少了加解锁的额外开销。

性能和场景:

性能极好,适用于单线程下需要频繁对String修改的场景。

在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中,则可以考虑使用,如SQL语句的拼装、JSON封装等、HTTP 参数组装等逻辑。


总结一下:

三者中只有String是不可变的,线程安全,并且他性能最低,适合字符串常量、少量拼接。

只有StringBuffer是加锁的,线程安全,性能一般,适合多线程下频繁修改字符串。

只有StringBuilder是不安全的,但是性能最快,适合单线程下频繁修改字符串。


【掌握程度】

能够清晰地定义String、StringBuffer和StringBuilder:解释它们的基本定义和特点。

理解它们的区别:包括不变性、线程安全性和性能。

知道使用场景:描述String、StringBuffer和StringBuilder适用的不同编程场景。


Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐