String、StringBuffer 和 StringBuilder 的区别

为什么出现StringBuffer 和 StringBuilder?

因为 String 类型是不可变的,所以在字符串拼接的时候如果使用 String 的话性能会很低,因此我们就需要使用另一个数据类型 StringBuffer,它提供了 append 和 insert 方法可用于字符串的拼接,它使用 synchronized 来保证线程安全,也因为 StringBuffer使用了 synchronized 来保证线程安全,所以性能不是很高,于是在 JDK 1.5 就有了 StringBuilder,它同样提供了 append 和 insert 的拼接方法,但它没有使用 synchronized 来修饰,因此在性能上要优于 StringBuffer,所以在非并发操作的环境下可使用 StringBuilder 来进行字符串拼接。

区别

简答

1) String 长度大小不可变,StringBuffer 和 StringBuilder 长度可变

2) StringBuffer 线程安全,StringBuilder 线程不安全,因此StringBuilder性能上要优于 StringBuffer(巧记:游戏中射手拿了红buffer后再打团比较安全

详答

1) String:字符串常量,字符串长度不可变。Java中String 是immutable(不可变)的。用于存放字符的数组被声明为final的,因此只能赋值一次,不可再更改。

2) StringBuffer:字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,出于效率考虑最好使用 StringBuffer,如果想转成 String 类型,可以调用 StringBuffer 的 toString() 方法。Java.lang.StringBuffer 线程安全的可变字符序列。在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。

3) StringBuilder:字符串变量(非线程安全)。在内部 StringBuilder 对象被当作是一个包含字符序列的变长数组。

使用场景

如果要操作少量的数据用 String ;

单线程操作大量数据用StringBuilder ;

多线程操作大量数据,用StringBuffer。

常见面试题

StringBuffer和StringBuilder 哪个安全?(蜜源)

我先说下为什么会出现StringBuffer 和 StringBuilder?我们知道String 是被final修饰的字符串常量,长度是不可变,所以在字符串拼接的时候如果使用 String 的话性能会很低,因此就出现了长度可变的StringBuffer 和 StringBuilder,StringBuilder是非线程安全的,StringBuffer是线程安全的(使用 synchronized 同步来保证线程安全),因此StringBuilder在性能上要优于 StringBuffer,在非并发操作的环境下可使用 StringBuilder 来进行字符串拼接。

 

希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。

扫描下方二维码关注微信公众号,您会收到更多优质文章推送。

posted @ 2019-08-02 16:24  JustJavaIt  阅读(241)  评论(0编辑  收藏  举报