![c4475753a8732dec7763c0967f093224.png](https://i-blog.csdnimg.cn/blog_migrate/9815206c690499fe6ddaf451b1b4061d.jpeg)
1. String、StringBuffer、StringBuilder
原文出自《编写高质量代码:改善 Java 程序的 151 个建议》
CharSequence 接口有三个实现类与字符串有关:String、StringBuffer、StringBuilder,虽然它们都与字符串有关,但是其处理机制是不同的。
String 类是不可改变的量,也就是创建后就不能再修改了,比如创建了一个“abc”这样的字符串对象,那么它在内存中永远都会是“abc”这样具有固定表面值的一个对象,不能被修改,即使想通过 String 提供的方法来尝试修改,也是要么创建一个新的字符串对象,要么返回自己,比如:
String str = "abc";String str1 = str.substring(1);
StringBuffer 是一个可变字符序列,它与 String 一样,在内存中保存的都是一个有序的字符序列(char 类型的数组),不同点是 StringBuffer 对象的值是可改变的,例如:
StringBuffer sb = new StringBuffer("a");sb.append("b");
从上面的代码可以看出 sb 的值在改变,初始化的时候是“a”,经过 append 方法后,其值变成了“ab”。可能有读者会问了,这与 String 类通过“+”连接有什么区别?例如:
String s = "a";s = s + "b";
有区别,字符串变量 s 初始化时是“a”对象的引用,经过加号计算后,s 变量就修改为了“ab”的引用,但是初始化的“a”对象还是没有改变,只是变量 s 指向了新的引用地址。再看看 StringBuffer 的对象,它的引用地址虽不变,但值在改变。
StringBuilder 与 StringBuffer 基本相同,都是可变字符序列,不同点是:StringBuffer 是线程安全的,StringBuilder 是线程不安全的,翻翻两者的源代码,就会发现在 StringBuffer 的方法前都有 synchronized 关键字,这也是 StringBuffer 在性能上远低于 StringBuilder 的原因。
在性能方面,由于 String 类的操作都是产生新的 String 对象,而 StringBuilder 和 StringBuffer 只是一个字符数组的再扩容而已,所以 String 类的操作要远慢于 StringBuffer 和 StringBuilder。
弄清楚了三者的原理,我们就可以在不同的场景下使用不同的字符序列了:
(1)使用 String 类的场景
在字符串不经常变化的场景中可以使用 String 类,例如常量的声明、少量的变量运算等。
(2)使用 StringBuffer 类的场景
在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在多线程的环境中,则可以考虑使用 StringBuffer,例如 XML 解析、HTTP 参数解析和封装等。
(3)使用 StringBuilder 类的场景
在频繁进行字符串的运算(如拼接、替换、删除等),并且运行在单线程的环境中,则可以考虑使用 StringBuilder,如 SQL 语句的拼装、JSON 封装等。
2 String,StringBuffer, StringBuilder 的区别是什么
1、String 是字符串常量,而 StringBuffer 和 StringBuilder 是字符串变量。由 String 创建的字符内容是不可改变的,而由 StringBuffer 和 StringBuidler 创建的字符内容是可以改变的。
2、StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的。StringBuilder 是从 JDK 5 开始,为 StringBuffer 类补充的一个单线程的等价类。我们在使用时应优先考虑使用 StringBuilder,因为它支持 StringBuffer 的所有操作,但是因为它不执行同步,不会有线程安全带来额外的系统消耗,所以速度更快。
![8803226b4e430582b1deea75b1a0d635.png](https://i-blog.csdnimg.cn/blog_migrate/84dbe0e7901a517740963227a4164c8d.jpeg)
![10d30fb0a6164029167b1b21bf3f76e0.png](https://i-blog.csdnimg.cn/blog_migrate/69f369f6b132478d583cc43658887a79.jpeg)
- END -
![a1f51259e91c11f0211b9919b4d6a6f1.png](https://i-blog.csdnimg.cn/blog_migrate/d98f2b1114e7110d2df92f0731686edd.jpeg)