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 来进行字符串拼接。
希望本文章对您有帮助,您的转发、点赞是我的创作动力,十分感谢。
扫描下方二维码关注微信公众号,您会收到更多优质文章推送。