【Java】String、StringBuffer、StringBuilder的区别?
【简要回答】
回答纲要:
首先一句话引入。
接着分别介绍三种:
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适用的不同编程场景。
更多推荐

所有评论(0)