【Java】String、StringBuffer、StringBuilder有什么区别

String

在Java中,String类用于用于创建和操作字符串。String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,在这里不作赘述。但值得注意的是,String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了。

1
2
3
4
5
String s = "Google";
System.out.println("s = " + s);

s = "Baidu";
System.out.println("s = " + s);

上段代码的运行结果如下:

1
2
s = Google
s = Baidu

看似String类是可以改变的,那为什么又说String类是不可改变的呢?

答:在这里的变量s,并非String对象,而是指向对象地址的引用。变量s存储在栈空间,而真正的对象存储在堆空间。

String、StringBuffer、StringBuilder有什么区别.png

在执行上图中的两句代码时,堆空间实际上创建了两个对象,变量s改变的是内存中对象的地址,第一个对象的内容并未发生改变,最后也会被垃圾回收机制回收内存。所以说,String 类是不可改变的,你一旦创建了 String 对象,那它的值就无法改变了。对了,String 是被 final 修饰的,他的长度是不可变的。

StringBuffer、StringBuilder

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

三者在执行速度方面的比较:

StringBuilder > StringBuffer > String

如何正确地、适当地使用这三个类:

  • 如果要求字符串不可变,操作少量数据,那么应该选择String类

  • 如果需要字符串可变并且是线程安全的,操作大量数据,那么应选择StringBuffer类

  • 如果要求字符串可变并且不存在线程安全问题,操作大量数据,那么应选择StringBuilder类