Java字符串的input是哪个 java字符串用什么表示_字符串

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 的区别是什么